<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>faebusoft</title>
	<atom:link href="http://www.faebusoft.ch/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.faebusoft.ch</link>
	<description>Rund um SAP Entwicklung, Web- und Wordpressentwicklung und um Android Entwicklung</description>
	<lastBuildDate>Thu, 15 Mar 2012 08:23:56 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>SAP Listbox ohne leeren Eintrag</title>
		<link>http://www.faebusoft.ch/sap/sap-listbox-ohne-leeren-eintrag/</link>
		<comments>http://www.faebusoft.ch/sap/sap-listbox-ohne-leeren-eintrag/#comments</comments>
		<pubDate>Thu, 15 Mar 2012 08:23:56 +0000</pubDate>
		<dc:creator>faebu</dc:creator>
				<category><![CDATA[ABAP Entwicklung]]></category>
		<category><![CDATA[SAP]]></category>

		<guid isPermaLink="false">http://www.faebusoft.ch/?p=182</guid>
		<description><![CDATA[Wenn man in einem Dynpro eine SAP Listbox verwendet, werden normalerweise die möglichen Auswahlwerte mit dem Funktionsbaustein VRM_SET_VALUES gesetzt. Und obwohl man in der Wertetabelle keinen leeren Eintrag definiert hat, enthält die Listebox nebst den Werten eine Leerzeile, die ganz normal selektiert werden kann. Nach kurzer Suche bin auf die Lösung des Problems gefunden. Es [...]]]></description>
			<content:encoded><![CDATA[<p>Wenn man in einem Dynpro eine SAP Listbox verwendet, werden normalerweise die möglichen Auswahlwerte mit dem Funktionsbaustein VRM_SET_VALUES gesetzt. Und obwohl man in der Wertetabelle keinen leeren Eintrag definiert hat, enthält die Listebox nebst den Werten eine Leerzeile, die ganz normal selektiert werden kann. <span id="more-182"></span></p>
<p>Nach kurzer Suche bin auf die Lösung des Problems gefunden. Es hängt nicht mit den Werten zusammen sondern vielmehr mit dem Attribut, ob es sich um ein Mussfeld handelt oder nicht. Solange es sich um ein Kann-Feld handelt wird die leere Zeile angezeigt, weil man ja bei einer Kann-Eingabe, das Feld auch leeren können muss. Schaltet man jedoch das Feld auf Musseingabe um, verschwindet auch die ominöse Leerzeile ganz von alleine.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.faebusoft.ch/sap/sap-listbox-ohne-leeren-eintrag/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Admin-Toolbar in WordPress entfernen</title>
		<link>http://www.faebusoft.ch/webentwicklung/admin-toolbar-in-wordpress-entfernen/</link>
		<comments>http://www.faebusoft.ch/webentwicklung/admin-toolbar-in-wordpress-entfernen/#comments</comments>
		<pubDate>Fri, 09 Mar 2012 10:43:12 +0000</pubDate>
		<dc:creator>faebu</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[Wordpress Plugins]]></category>

		<guid isPermaLink="false">http://www.faebusoft.ch/?p=181</guid>
		<description><![CDATA[Seit WordPress 3.1 gibt es die Admin-Toolbar, welche oben auf der Website erscheint, sobald ein Benutzer angemeldet ist. Wer diese loswerden möchte, platziert folgendes Stück Code in die Datei functions.php des Themes. add_filter&#40;'show_admin_bar', '__return_false'&#41;;]]></description>
			<content:encoded><![CDATA[<p>Seit WordPress 3.1 gibt es die Admin-Toolbar, welche oben auf der Website erscheint, sobald ein Benutzer angemeldet ist. Wer diese loswerden möchte, platziert folgendes Stück Code in die Datei functions.php des Themes.</p>

<div class="wp_syntax"><div class="code"><pre class="php">add_filter<span class="br0">&#40;</span><span class="st_h">'show_admin_bar'</span><span class="sy0">,</span> <span class="st_h">'__return_false'</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.faebusoft.ch/webentwicklung/admin-toolbar-in-wordpress-entfernen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WP Calendar V1.5.0 Beta 1 freigegeben</title>
		<link>http://www.faebusoft.ch/webentwicklung/wordpress-plugins/wp-calendar-v1-5-0-beta-1-freigegeben/</link>
		<comments>http://www.faebusoft.ch/webentwicklung/wordpress-plugins/wp-calendar-v1-5-0-beta-1-freigegeben/#comments</comments>
		<pubDate>Sun, 04 Mar 2012 14:13:04 +0000</pubDate>
		<dc:creator>faebu</dc:creator>
				<category><![CDATA[Wordpress Plugins]]></category>

		<guid isPermaLink="false">http://www.faebusoft.ch/?p=179</guid>
		<description><![CDATA[Nach einem ganzen Jahr ohne Updates, konnte ich endlich wieder einmal etwas Zeit investieren und heute eine erste Bta V1.5.0 veröffentlichen. V1.5.0 behebt verschiedene Problem und macht das Plug-In auch mit WP 3.3 kompatible. Es wurden alle gemeldeten, reproduzierbaren Fehler aus der Community behoben. Die Hauptänderung in V1.5 ist aber eine neue Datenbankstruktur. Alle bisherigen [...]]]></description>
			<content:encoded><![CDATA[<p>Nach einem ganzen Jahr ohne Updates, konnte ich endlich wieder einmal etwas Zeit investieren und heute eine erste Bta V1.5.0 veröffentlichen.</p>
<p><span id="more-179"></span>V1.5.0 behebt verschiedene Problem und macht das Plug-In auch mit WP 3.3 kompatible. Es wurden alle gemeldeten, reproduzierbaren Fehler aus der Community behoben.</p>
<p>Die Hauptänderung in V1.5 ist aber eine neue Datenbankstruktur. Alle bisherigen Datumsfelder, deren Werte bis anhin mit Unix Zeitstempeln gespeichert wurden, wurden durch neuen MySQL Datetime Felder abgelöst. Dies macht es einerseits für die Entwicklung einfacher, aber auch für alle Benutzer, da man nun in Tags und Funktionen nicht mehr mit Zeitstempeln arbeiten muss, sondern lesbare Werte verwenden kann. Die Anpassungen wurden jedoch nicht aus Komformt-Gründen durchgeführt. Vielmehr lag hier ein technischer Fehler vor, denn Unix Zeitstempel sind Zeitzonen-Neutral und müssen aber auch entsrpechend in UTC konvertiert werden, damit dann zur Laufzeit eine Konvertierung in die korrekte Zeitzone erfolgen kann. WP Calendar hatte jedoch die Daten nie konvertiert, sodass es bei Zeitzonen mit Sommerzeit immer wieder zu Problemen kann.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.faebusoft.ch/webentwicklung/wordpress-plugins/wp-calendar-v1-5-0-beta-1-freigegeben/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Konvertieren von UTC-Timestamps</title>
		<link>http://www.faebusoft.ch/sap/konvertieren-von-utc-timestamps/</link>
		<comments>http://www.faebusoft.ch/sap/konvertieren-von-utc-timestamps/#comments</comments>
		<pubDate>Fri, 17 Feb 2012 09:17:42 +0000</pubDate>
		<dc:creator>faebu</dc:creator>
				<category><![CDATA[ABAP Entwicklung]]></category>
		<category><![CDATA[SAP]]></category>

		<guid isPermaLink="false">http://www.faebusoft.ch/?p=178</guid>
		<description><![CDATA[Liest man z.B. aus dem Dateisystem Dateiattribute aus, erhält man auf den ersten Blick falsche Uhrzeiten zurück. Aber nur auf den ersten Blick, denn Betriebssystem speichern Dateiattribute mit Hilfe von Timestamps, die Zeitzonen-neutral sind und umgerechnet werden müssen. Wer im SAP nach einem entsprechenden Funktionsbaustein sucht, wird wohl nicht fündig. Es geht allerdings noch einfacher, [...]]]></description>
			<content:encoded><![CDATA[<p>Liest man z.B. aus dem Dateisystem Dateiattribute aus, erhält man auf den ersten Blick falsche Uhrzeiten zurück. Aber nur auf den ersten Blick, denn Betriebssystem speichern Dateiattribute mit Hilfe von Timestamps, die Zeitzonen-neutral sind und umgerechnet werden müssen.<span id="more-178"></span><br />
Wer im SAP nach einem entsprechenden Funktionsbaustein sucht, wird wohl nicht fündig. Es geht allerdings noch einfacher, denn SAP bietet für genau diese Konvertierung von UTC Timestamps in das aktuelle Datum und die Uhrzeit einen Befehl an. Ein Timestamp ist übrigens nicht anderes als die Darstellung von Datum und Uhrzeit in einem 14 Stellen langen Feld im Format YYYYMMDDHHMMSS.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code"><pre class="abap"><a href="http://help.sap.com/abapdocu/en/ABAPDATA.htm"><span class="kw2">DATA</span></a><span class="sy0">:</span>
    lf_datum_utc        <span class="kw4">TYPE</span> datum
  <span class="sy0">,</span> lf_uzeit_utc        <span class="kw4">TYPE</span> uzeit
  <span class="sy0">,</span> lf_datum_akt        <span class="kw4">TYPE</span> datum
  <span class="sy0">,</span> lf_datum_utc        <span class="kw4">TYPE</span> uzeit
  <span class="sy0">,</span> lf_timestamp        <span class="kw4">TYPE</span> <span class="kw4">timestamp</span>
  <span class="sy0">,</span> lf_timestamp_s      <span class="kw4">TYPE</span> char15
  <span class="sy0">.</span>
&nbsp;
<span class="co1">&quot;Zuerst mal einen Timestamp aus Datum/Uhrzeit bilden</span>
<span class="co1">&quot;falls Timestamp nicht vorliegt</span>
<a href="http://help.sap.com/abapdocu/en/ABAPCONCATENATE.htm"><span class="kw3">CONCATENATE</span></a> lf_datum_utc
            lf_uzeit_utc <span class="kw4">INTO</span> lf_timestamp_s<span class="sy0">.</span>
lf_timestamp <span class="sy1">=</span> lf_timestamp_s<span class="sy0">.</span>
&nbsp;
<span class="co1">&quot;Umrechnen lassen</span>
<span class="kw8">CONVERT <span class="kw4">TIME</span> STAMP</span> lf_timestamp
        <span class="kw9">TIME ZONE</span> sy<span class="sy0">-</span>zonlo <span class="kw4">INTO</span>
        <span class="kw4">DATE</span> lf_datum_akt
        <span class="kw4">TIME</span> lf_datum_akt<span class="sy0">.</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.faebusoft.ch/sap/konvertieren-von-utc-timestamps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Desktop Organisation!</title>
		<link>http://www.faebusoft.ch/allgemein/desktop-organisation/</link>
		<comments>http://www.faebusoft.ch/allgemein/desktop-organisation/#comments</comments>
		<pubDate>Fri, 14 Oct 2011 07:06:04 +0000</pubDate>
		<dc:creator>faebu</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://www.faebusoft.ch/?p=175</guid>
		<description><![CDATA[Mein Windows 7 Desktop ist der Sammeltopf für alles, was aktuell irgendwie noch in Bearbeitung ist. So entsteht innert wenigen Wochen eigentlich immer eine grosse Unordnung, die nicht nur organisatorisch sondern vor allem auch optisch nicht erwünscht ist. Mit dem Tool Fences habe ich jedoch eine gute Lösung gefunden. Das Tool Fences gibt es als [...]]]></description>
			<content:encoded><![CDATA[<p>Mein Windows 7 Desktop ist der Sammeltopf für alles, was aktuell irgendwie noch in Bearbeitung ist. So entsteht innert wenigen Wochen eigentlich immer eine grosse Unordnung, die nicht nur organisatorisch sondern vor allem auch optisch nicht erwünscht ist. Mit dem Tool Fences habe ich jedoch eine gute Lösung gefunden.</p>
<p><span id="more-175"></span>Das Tool <a href="http://www.stardock.com/products/fences/index.asp">Fences</a> gibt es als gratis Version <a href="http://www.stardock.com/products/fences/downloads.asp">hier</a> zum downloaden. Mit diesem kleinen Helfer lassen sich auf dem Desktop eine Art &#8220;Container&#8221; mit Beschriftung anlegen. Darin lassen sich nun die Dateien auf dem Desktop gruppieren und innerhalb von diesen Fences auch (um-) sortieren. Damit lässt sich der Desktop wunderbar organisieren, da die Dateien nicht mehr &#8220;irgendwo&#8221; herumliegen sondern zumindest schon mal vorsortiert sind.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.faebusoft.ch/allgemein/desktop-organisation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Export/Import von SAP Web Repository Objekten</title>
		<link>http://www.faebusoft.ch/sap/exportimport-von-sap-web-repository-objekten/</link>
		<comments>http://www.faebusoft.ch/sap/exportimport-von-sap-web-repository-objekten/#comments</comments>
		<pubDate>Thu, 13 Oct 2011 07:57:06 +0000</pubDate>
		<dc:creator>faebu</dc:creator>
				<category><![CDATA[ABAP Entwicklung]]></category>
		<category><![CDATA[SAP]]></category>
		<category><![CDATA[Tips & Tricks]]></category>

		<guid isPermaLink="false">http://www.faebusoft.ch/?p=174</guid>
		<description><![CDATA[Mit der Transaktion SMW0 können SAP Web Repository Objekte gepflegt werden. Die Transaktion ist sehr simpel und der Funktionsumfang reicht aus, solange man nur einzelne Objekte bearbeiten bzw. aktualisieren möchte. Sobald man aber eine ganze Fülle an Objekten bearbeiten möchte, steht man mit diesem Werkzeug schnell mal an. Für die Massenbearbeitung habe ich ein kleines [...]]]></description>
			<content:encoded><![CDATA[<p>Mit der Transaktion SMW0 können SAP Web Repository Objekte gepflegt werden. Die Transaktion ist sehr simpel und der Funktionsumfang reicht aus, solange man nur einzelne Objekte bearbeiten bzw. aktualisieren möchte. Sobald man aber eine ganze Fülle an Objekten bearbeiten möchte, steht man mit diesem Werkzeug schnell mal an.</p>
<p><span id="more-174"></span>Für die Massenbearbeitung habe ich ein kleines Programm geschrieben, mit dem sich mehrere Objekte auf einmal exportieren bzw. importieren lassen.</p>
<p><em>Kleine Anmerkung am Rande: Wer sich alle SAP Ikonen exportieren lassen möchte, kann dies mit diesem Report ebenfalls tun. Sämtliche SAP Ikonen befinden sich im Paket SWWW&#8230;</em></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
</pre></td><td class="code"><pre class="abap"><span class="co2">*&amp;---------------------------------------------------------------------*</span>
<span class="co2">*&amp; Report  Z_SMW0_TRANSFER                                             *</span>
<span class="co2">*&amp;                                                                     *</span>
<span class="co2">*&amp;---------------------------------------------------------------------*</span>
<span class="co2">*&amp;                                                                     *</span>
<span class="co2">*&amp;                                                                     *</span>
<span class="co2">*&amp;---------------------------------------------------------------------*</span>
&nbsp;
<a href="http://help.sap.com/abapdocu/en/ABAPREPORT.htm"><span class="kw3">report</span></a>  z_smw0_transfer                         <span class="sy0">.</span>
&nbsp;
<a href="http://help.sap.com/abapdocu/en/ABAPTYPE-POOLS.htm"><span class="kw2">type-pools</span></a><span class="sy0">:</span> vrm
          <span class="sy0">.</span>
&nbsp;
<a href="http://help.sap.com/abapdocu/en/ABAPDATA.htm"><span class="kw2">data</span></a><span class="sy0">:</span>
    lf_devc <span class="kw4">type</span> devclass
  <span class="sy0">,</span> lf_name <span class="kw4">type</span> w3objid
  <span class="sy0">,</span> lt_objects  <span class="kw4">type</span> <span class="kw9">standard <span class="kw4">table</span> of</span> wwwdatatab
  <span class="sy0">,</span> lf_path_old <span class="kw4">type</span> <span class="kw4">string</span>
  <span class="sy0">,</span> lf_path_new <span class="kw4">type</span> <span class="kw4">string</span>
  <span class="sy0">,</span> lt_lb_values <span class="kw4">type</span> vrm_values
  <span class="sy0">,</span> lf_value
  <span class="sy0">,</span> lt_data <span class="kw4">type</span> <span class="kw9">standard <span class="kw4">table</span> of</span> w3mime
  <span class="sy0">,</span> lf_param<span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span>
  <span class="sy0">,</span> lf_filesize <span class="kw4">type</span> i
  <span class="sy0">,</span> lf_filename <span class="kw4">type</span> <span class="kw4">string</span>
  <span class="sy0">,</span> lf_res <span class="kw4">type</span> flag
  <span class="sy0">,</span> lf_count <span class="kw4">type</span> i
  <span class="sy0">,</span> lt_files <span class="kw4">type</span> <span class="kw9">table of</span> file
  <span class="sy0">,</span> lf_objid <span class="kw4">type</span> w3objid
  <span class="sy0">,</span> lf_subrc <span class="kw4">type</span> sysubrc
  <span class="sy0">,</span> lf_new <span class="kw4">type</span> flag
  <span class="sy0">.</span>
&nbsp;
<a href="http://help.sap.com/abapdocu/en/ABAPFIELD-SYMBOLS.htm"><span class="kw2">field-symbols</span></a><span class="sy0">:</span>
    <span class="sy1">&lt;</span>obj<span class="sy1">&gt;</span> <span class="kw4">type</span> wwwdatatab
  <span class="sy0">,</span> <span class="sy1">&lt;</span>lb_value<span class="sy1">&gt;</span> <span class="kw4">type</span> vrm_value
  <span class="sy0">,</span> <span class="sy1">&lt;</span>file<span class="sy1">&gt;</span>  <span class="kw4">type</span> file
  <span class="sy0">.</span>
&nbsp;
<a href="http://help.sap.com/abapdocu/en/ABAPSELECTION-SCREEN.htm"><span class="kw3">selection-screen</span></a> <span class="kw9">begin <span class="kw4">of</span> block</span> bl1 <span class="kw9">with frame</span> <span class="kw4">title</span> text<span class="sy0">-</span>001<span class="sy0">.</span>
<a href="http://help.sap.com/abapdocu/en/ABAPPARAMETERS.htm"><span class="kw2">parameters</span></a><span class="sy0">:</span> p_act <span class="kw9">as listbox</span> <span class="kw9">visible length</span> <span class="nu0">20</span> <span class="kw4">default</span> <span class="st0">'E'</span> <span class="kw4">user-command</span> dmy<span class="sy0">.</span>
&nbsp;
select<span class="sy0">-</span><span class="kw4">options</span><span class="sy0">:</span> p_devc <span class="kw4">for</span> lf_devc
              <span class="sy0">,</span> p_name <span class="kw4">for</span> lf_name
              <span class="sy0">.</span>
<a href="http://help.sap.com/abapdocu/en/ABAPPARAMETERS.htm"><span class="kw2">parameters</span></a><span class="sy0">:</span> p_path <span class="kw4">type</span> char255
          <span class="sy0">,</span> p_overr <span class="kw9">as checkbox</span> <span class="kw4">default</span> <span class="st0">'X'</span>
          <span class="sy0">,</span> p_create <span class="kw9">as checkbox</span> <span class="kw4">default</span> <span class="st0">''</span>
          <span class="sy0">,</span> p_test <span class="kw9">as checkbox</span> <span class="kw4">default</span> <span class="st0">'X'</span>
          <span class="sy0">.</span>
<a href="http://help.sap.com/abapdocu/en/ABAPSELECTION-SCREEN.htm"><span class="kw3">selection-screen</span></a> <span class="kw9">end <span class="kw4">of</span> block</span> bl1<span class="sy0">.</span>
&nbsp;
<a href="http://help.sap.com/abapdocu/en/ABAPINITIALIZATION.htm"><span class="kw3">initialization</span></a><span class="sy0">.</span>
  <a href="http://help.sap.com/abapdocu/en/ABAPAPPEND.htm"><span class="kw3">append</span></a> <span class="kw9">initial line</span> <span class="kw4">to</span> lt_lb_values <span class="kw4">assigning</span> <span class="sy1">&lt;</span>lb_value<span class="sy1">&gt;</span><span class="sy0">.</span>
  <span class="sy1">&lt;</span>lb_value<span class="sy1">&gt;</span><span class="sy0">-</span><span class="kw4">key</span> <span class="sy1">=</span> <span class="st0">'E'</span><span class="sy0">.</span>
  <span class="sy1">&lt;</span>lb_value<span class="sy1">&gt;</span><span class="sy0">-</span>text <span class="sy1">=</span> <span class="st0">'Exportieren'</span><span class="sy0">.</span>
&nbsp;
  <a href="http://help.sap.com/abapdocu/en/ABAPAPPEND.htm"><span class="kw3">append</span></a> <span class="kw9">initial line</span> <span class="kw4">to</span> lt_lb_values <span class="kw4">assigning</span> <span class="sy1">&lt;</span>lb_value<span class="sy1">&gt;</span><span class="sy0">.</span>
  <span class="sy1">&lt;</span>lb_value<span class="sy1">&gt;</span><span class="sy0">-</span><span class="kw4">key</span> <span class="sy1">=</span> <span class="st0">'I'</span><span class="sy0">.</span>
  <span class="sy1">&lt;</span>lb_value<span class="sy1">&gt;</span><span class="sy0">-</span>text <span class="sy1">=</span> <span class="st0">'Importieren'</span><span class="sy0">.</span>
&nbsp;
  <span class="kw8">call function</span> <span class="st0">'VRM_SET_VALUES'</span>
    <span class="kw4">exporting</span>
      <span class="kw4">id</span>     <span class="sy1">=</span> <span class="st0">'P_ACT'</span>
      <span class="kw4">values</span> <span class="sy1">=</span> lt_lb_values
    <span class="kw4">exceptions</span>
      <span class="kw4">others</span> <span class="sy1">=</span> <span class="nu0">1</span><span class="sy0">.</span>
&nbsp;
  <a href="http://help.sap.com/abapdocu/en/ABAPIF.htm"><span class="kw1">if</span></a> sy<span class="sy0">-</span>subrc <span class="sy1">&lt;&gt;</span> <span class="nu0">0</span><span class="sy0">.</span>
    <a href="http://help.sap.com/abapdocu/en/ABAPMESSAGE.htm"><span class="kw3">message</span></a> <span class="kw4">id</span> sy<span class="sy0">-</span>msgid <span class="kw4">type</span> <span class="st0">'A'</span> <span class="kw4">number</span> sy<span class="sy0">-</span>msgno
            <span class="kw4">with</span> sy<span class="sy0">-</span>msgv1 sy<span class="sy0">-</span>msgv2 sy<span class="sy0">-</span>msgv3 sy<span class="sy0">-</span>msgv4<span class="sy0">.</span>
  <a href="http://help.sap.com/abapdocu/en/ABAPENDIF.htm"><span class="kw1">endif</span></a><span class="sy0">.</span>
&nbsp;
&nbsp;
<span class="kw8">at selection-screen</span> <span class="kw9">on <span class="kw4">value-request</span> for</span> p_path<span class="sy0">.</span>
  <a href="http://help.sap.com/abapdocu/en/ABAPCLEAR.htm"><span class="kw3">clear</span></a> lf_path_old<span class="sy0">.</span>
  <span class="kw8">call method</span> cl_gui_frontend_services<span class="sy0">=&gt;</span><span class="me2">directory_browse</span>
    <span class="kw4">exporting</span>
      initial_folder  <span class="sy1">=</span> lf_path_old
    <span class="kw4">changing</span>
      selected_folder <span class="sy1">=</span> lf_path_new
    <span class="kw4">exceptions</span>
      <span class="kw4">others</span>          <span class="sy1">=</span> <span class="nu0">1</span><span class="sy0">.</span>
  <a href="http://help.sap.com/abapdocu/en/ABAPCHECK.htm"><span class="kw1">check</span></a> sy<span class="sy0">-</span>subrc <span class="sy1">=</span> <span class="nu0">0</span> <span class="kw4">and</span> <span class="kw4">not</span> lf_path_new <span class="kw4">is</span> <span class="kw4">initial</span><span class="sy0">.</span>
  p_path <span class="sy1">=</span> lf_path_new<span class="sy0">.</span>
&nbsp;
<span class="kw8">at selection-screen</span> <span class="kw4">output</span><span class="sy0">.</span>
  <span class="kw7">loop <a href="http://help.sap.com/abapdocu/en/ABAPAT.htm"><span class="kw3">at</span></a> screen</span><span class="sy0">.</span>
    <a href="http://help.sap.com/abapdocu/en/ABAPIF.htm"><span class="kw1">if</span></a> screen<span class="sy0">-</span><span class="kw4">name</span> <span class="sy1">=</span> <span class="st0">'P_OVERR'</span><span class="sy0">.</span>
      <a href="http://help.sap.com/abapdocu/en/ABAPIF.htm"><span class="kw1">if</span></a> p_act <span class="sy1">=</span> <span class="st0">'E'</span><span class="sy0">.</span>
        screen<span class="sy0">-</span><a href="http://help.sap.com/abapdocu/en/ABAPINPUT.htm"><span class="kw3">input</span></a> <span class="sy1">=</span> <span class="st0">'1'</span><span class="sy0">.</span>
      <a href="http://help.sap.com/abapdocu/en/ABAPELSE.htm"><span class="kw1">else</span></a><span class="sy0">.</span>
        screen<span class="sy0">-</span><a href="http://help.sap.com/abapdocu/en/ABAPINPUT.htm"><span class="kw3">input</span></a> <span class="sy1">=</span> <span class="st0">'0'</span><span class="sy0">.</span>
      <a href="http://help.sap.com/abapdocu/en/ABAPENDIF.htm"><span class="kw1">endif</span></a><span class="sy0">.</span>
      <span class="kw8">modify screen</span><span class="sy0">.</span>
    <a href="http://help.sap.com/abapdocu/en/ABAPELSEIF.htm"><span class="kw1">elseif</span></a> screen<span class="sy0">-</span><span class="kw4">name</span> <span class="sy1">=</span> <span class="st0">'P_CREATE'</span><span class="sy0">.</span>
      <a href="http://help.sap.com/abapdocu/en/ABAPIF.htm"><span class="kw1">if</span></a> p_act <span class="sy1">=</span> <span class="st0">'I'</span><span class="sy0">.</span>
        screen<span class="sy0">-</span><a href="http://help.sap.com/abapdocu/en/ABAPINPUT.htm"><span class="kw3">input</span></a> <span class="sy1">=</span> <span class="st0">'1'</span><span class="sy0">.</span>
      <a href="http://help.sap.com/abapdocu/en/ABAPELSE.htm"><span class="kw1">else</span></a><span class="sy0">.</span>
        screen<span class="sy0">-</span><a href="http://help.sap.com/abapdocu/en/ABAPINPUT.htm"><span class="kw3">input</span></a> <span class="sy1">=</span> <span class="st0">'0'</span><span class="sy0">.</span>
      <a href="http://help.sap.com/abapdocu/en/ABAPENDIF.htm"><span class="kw1">endif</span></a><span class="sy0">.</span>
      <span class="kw8">modify screen</span><span class="sy0">.</span>
    <a href="http://help.sap.com/abapdocu/en/ABAPENDIF.htm"><span class="kw1">endif</span></a><span class="sy0">.</span>
  <a href="http://help.sap.com/abapdocu/en/ABAPENDLOOP.htm"><span class="kw1">endloop</span></a><span class="sy0">.</span>
&nbsp;
<a href="http://help.sap.com/abapdocu/en/ABAPSTART-OF-SELECTION.htm"><span class="kw3">start-of-selection</span></a><span class="sy0">.</span>
&nbsp;
  <a href="http://help.sap.com/abapdocu/en/ABAPIF.htm"><span class="kw1">if</span></a> p_path <span class="kw4">is</span> <span class="kw4">initial</span><span class="sy0">.</span>
    <a href="http://help.sap.com/abapdocu/en/ABAPMESSAGE.htm"><span class="kw3">message</span></a> i008<span class="br0">&#40;</span><span class="sy0">/</span>pronovia<span class="sy0">/</span>basic<span class="br0">&#41;</span> <span class="kw4">with</span> <span class="st0">'Bitte wählen Sie einen Pfad'</span><span class="sy0">.</span>
    <a href="http://help.sap.com/abapdocu/en/ABAPEXIT.htm"><span class="kw1">exit</span></a><span class="sy0">.</span>
  <a href="http://help.sap.com/abapdocu/en/ABAPENDIF.htm"><span class="kw1">endif</span></a><span class="sy0">.</span>
&nbsp;
  <a href="http://help.sap.com/abapdocu/en/ABAPPERFORM.htm"><span class="kw3">perform</span></a> check_slash_at_path_end <span class="kw9">in program</span> <span class="sy0">/</span>pronovia<span class="sy0">/</span>saplsdf
&nbsp;
    <span class="kw4">changing</span> p_path<span class="sy0">.</span>
&nbsp;
  <a href="http://help.sap.com/abapdocu/en/ABAPFORMAT.htm"><span class="kw3">format</span></a> <span class="kw4">color</span> <span class="kw4">col_background</span> <span class="kw4">intensified</span> <span class="kw4">off</span><span class="sy0">.</span>
&nbsp;
  <a href="http://help.sap.com/abapdocu/en/ABAPIF.htm"><span class="kw1">if</span></a> p_act <span class="sy1">=</span> <span class="st0">'E'</span><span class="sy0">.</span>
    <a href="http://help.sap.com/abapdocu/en/ABAPSELECT.htm"><span class="kw3">select</span></a> <span class="sy0">*</span> <span class="kw4">from</span> wwwdata <span class="kw4">as</span> f <span class="kw4">inner</span> <span class="kw4">join</span> tadir <span class="kw4">as</span> p
      on f~objid <span class="sy1">=</span> p~obj_name
      <span class="kw4">into</span>  <span class="kw9">corresponding <a href="http://help.sap.com/abapdocu/en/ABAPFIELDS.htm"><span class="kw2">fields</span></a> <span class="kw4">of</span> table</span> lt_objects
      <span class="kw4">where</span> f~srtf2 <span class="sy1">=</span> <span class="nu0">0</span>
      <span class="kw4">and</span>   f~relid <span class="sy1">=</span> <span class="st0">'MI'</span>
      <span class="kw4">and</span>   p~pgmid    <span class="sy1">=</span> <span class="st0">'R3TR'</span>
      <span class="kw4">and</span>   p~object   <span class="sy1">=</span> <span class="st0">'W3MI'</span>
      <span class="kw4">and</span>   p~devclass <span class="kw4">in</span> p_devc
      <span class="kw4">and</span>   p~obj_name <span class="kw4">in</span> p_name<span class="sy0">.</span>
&nbsp;
    <span class="kw7">loop at</span> lt_objects <span class="kw4">assigning</span> <span class="sy1">&lt;</span>obj<span class="sy1">&gt;</span><span class="sy0">.</span>
      <a href="http://help.sap.com/abapdocu/en/ABAPWRITE.htm"><span class="kw3">write</span></a><span class="sy0">:</span> <span class="sy0">/</span> <span class="sy1">&lt;</span>obj<span class="sy1">&gt;</span><span class="sy0">-</span>devclass<span class="sy0">,</span> <span class="sy1">&lt;</span>obj<span class="sy1">&gt;</span><span class="sy0">-</span>objid<span class="sy0">,</span> <span class="sy1">&lt;</span>obj<span class="sy1">&gt;</span><span class="sy0">-</span>text<span class="sy0">.</span>
      <a href="http://help.sap.com/abapdocu/en/ABAPIF.htm"><span class="kw1">if</span></a> p_test <span class="kw4">is</span> <span class="kw4">initial</span><span class="sy0">.</span>
&nbsp;
        <a href="http://help.sap.com/abapdocu/en/ABAPCLEAR.htm"><span class="kw3">clear</span></a> lt_data<span class="br0">&#91;</span><span class="br0">&#93;</span><span class="sy0">.</span>
&nbsp;
<span class="co2">*       Get Filename</span>
        <span class="kw8">call function</span> <span class="st0">'WWWPARAMS_READ'</span>
          <span class="kw4">exporting</span>
            relid  <span class="sy1">=</span> <span class="sy1">&lt;</span>obj<span class="sy1">&gt;</span><span class="sy0">-</span>relid
            objid  <span class="sy1">=</span> <span class="sy1">&lt;</span>obj<span class="sy1">&gt;</span><span class="sy0">-</span>objid
            <span class="kw4">name</span>   <span class="sy1">=</span> <span class="st0">'filename'</span>
          <span class="kw4">importing</span>
            <span class="kw4">value</span>  <span class="sy1">=</span> lf_param
          <span class="kw4">exceptions</span>
            <span class="kw4">others</span> <span class="sy1">=</span> <span class="nu0">1</span><span class="sy0">.</span>
        <a href="http://help.sap.com/abapdocu/en/ABAPIF.htm"><span class="kw1">if</span></a> sy<span class="sy0">-</span>subrc <span class="sy1">=</span> <span class="nu0">0</span><span class="sy0">.</span>
          <span class="kw8">call function</span> <span class="st0">'CV120_SPLIT_FILE'</span>
            <span class="kw4">exporting</span>
              pf_file          <span class="sy1">=</span> lf_param
            <span class="kw4">importing</span>
              pfx_dotextension <span class="sy1">=</span> lf_param<span class="sy0">.</span>
&nbsp;
          <a href="http://help.sap.com/abapdocu/en/ABAPCONCATENATE.htm"><span class="kw3">concatenate</span></a> <span class="sy1">&lt;</span>obj<span class="sy1">&gt;</span><span class="sy0">-</span>objid lf_param <span class="kw4">into</span> lf_filename<span class="sy0">.</span>
          <a href="http://help.sap.com/abapdocu/en/ABAPTRANSLATE.htm"><span class="kw3">translate</span></a> lf_filename <span class="kw4">using</span> <span class="st0">'/¦'</span><span class="sy0">.</span>
&nbsp;
          <a href="http://help.sap.com/abapdocu/en/ABAPCONCATENATE.htm"><span class="kw3">concatenate</span></a> p_path lf_filename <span class="kw4">into</span> lf_filename<span class="sy0">.</span>
        <a href="http://help.sap.com/abapdocu/en/ABAPELSE.htm"><span class="kw1">else</span></a><span class="sy0">.</span>
          <a href="http://help.sap.com/abapdocu/en/ABAPFORMAT.htm"><span class="kw3">format</span></a> <span class="kw4">color</span> <span class="kw4">col_negative</span> <span class="kw4">intensified</span> on<span class="sy0">.</span>
          <a href="http://help.sap.com/abapdocu/en/ABAPWRITE.htm"><span class="kw3">write</span></a><span class="sy0">:</span> <span class="sy0">/</span> <span class="st0">'Fehler beim Lesen aus der Datenbank'</span><span class="sy0">.</span>
          <a href="http://help.sap.com/abapdocu/en/ABAPFORMAT.htm"><span class="kw3">format</span></a> <span class="kw4">color</span> <span class="kw4">col_background</span> <span class="kw4">intensified</span> <span class="kw4">off</span><span class="sy0">.</span>
          <a href="http://help.sap.com/abapdocu/en/ABAPCONTINUE.htm"><span class="kw1">continue</span></a><span class="sy0">.</span>
        <a href="http://help.sap.com/abapdocu/en/ABAPENDIF.htm"><span class="kw1">endif</span></a><span class="sy0">.</span>
&nbsp;
<span class="co2">*       Prüfen, ob Datei existiert</span>
        <a href="http://help.sap.com/abapdocu/en/ABAPIF.htm"><span class="kw1">if</span></a> p_overr <span class="sy1">=</span> <span class="kw4">space</span><span class="sy0">.</span>
          <span class="kw8">call method</span> cl_gui_frontend_services<span class="sy0">=&gt;</span><span class="me2">file_exist</span>
            <span class="kw4">exporting</span>
              file   <span class="sy1">=</span> lf_filename
            <span class="kw4">receiving</span>
              <span class="kw4">result</span> <span class="sy1">=</span> lf_res
            <span class="kw4">exceptions</span>
              <span class="kw4">others</span> <span class="sy1">=</span> <span class="nu0">1</span><span class="sy0">.</span>
          <span class="sy0">.</span>
          <a href="http://help.sap.com/abapdocu/en/ABAPIF.htm"><span class="kw1">if</span></a> sy<span class="sy0">-</span>subrc <span class="sy1">&lt;&gt;</span> <span class="nu0">0</span> <span class="kw4">or</span> lf_res <span class="sy1">&lt;&gt;</span> <span class="kw4">space</span><span class="sy0">.</span>
            <a href="http://help.sap.com/abapdocu/en/ABAPFORMAT.htm"><span class="kw3">format</span></a> <span class="kw4">color</span> <span class="kw4">col_total</span>  <span class="kw4">intensified</span> <span class="kw4">off</span><span class="sy0">.</span>
            <a href="http://help.sap.com/abapdocu/en/ABAPWRITE.htm"><span class="kw3">write</span></a><span class="sy0">:</span> <span class="sy0">/</span> <span class="st0">'Die Datei existiert bereits'</span><span class="sy0">.</span>
            <a href="http://help.sap.com/abapdocu/en/ABAPFORMAT.htm"><span class="kw3">format</span></a> <span class="kw4">color</span> <span class="kw4">col_background</span> <span class="kw4">intensified</span> <span class="kw4">off</span><span class="sy0">.</span>
            <a href="http://help.sap.com/abapdocu/en/ABAPCONTINUE.htm"><span class="kw1">continue</span></a><span class="sy0">.</span>
          <a href="http://help.sap.com/abapdocu/en/ABAPENDIF.htm"><span class="kw1">endif</span></a><span class="sy0">.</span>
&nbsp;
        <a href="http://help.sap.com/abapdocu/en/ABAPENDIF.htm"><span class="kw1">endif</span></a><span class="sy0">.</span>
&nbsp;
        <span class="kw8">call function</span> <span class="st0">'WWWDATA_IMPORT'</span>
          <span class="kw4">exporting</span>
            <span class="kw4">key</span>    <span class="sy1">=</span> <span class="sy1">&lt;</span>obj<span class="sy1">&gt;</span>
          <a href="http://help.sap.com/abapdocu/en/ABAPTABLES.htm"><span class="kw2">tables</span></a>
            mime   <span class="sy1">=</span> lt_data
          <span class="kw4">exceptions</span>
            <span class="kw4">others</span> <span class="sy1">=</span> <span class="nu0">1</span><span class="sy0">.</span>
        <a href="http://help.sap.com/abapdocu/en/ABAPIF.htm"><span class="kw1">if</span></a> sy<span class="sy0">-</span>subrc <span class="sy1">&lt;&gt;</span> <span class="nu0">0</span><span class="sy0">.</span>
          <a href="http://help.sap.com/abapdocu/en/ABAPFORMAT.htm"><span class="kw3">format</span></a> <span class="kw4">color</span> <span class="kw4">col_negative</span> <span class="kw4">intensified</span> on<span class="sy0">.</span>
          <a href="http://help.sap.com/abapdocu/en/ABAPWRITE.htm"><span class="kw3">write</span></a><span class="sy0">:</span> <span class="sy0">/</span> <span class="st0">'Fehler beim Lesen aus der Datenbank'</span><span class="sy0">.</span>
          <a href="http://help.sap.com/abapdocu/en/ABAPFORMAT.htm"><span class="kw3">format</span></a> <span class="kw4">color</span> <span class="kw4">col_background</span> <span class="kw4">intensified</span> <span class="kw4">off</span><span class="sy0">.</span>
          <a href="http://help.sap.com/abapdocu/en/ABAPCONTINUE.htm"><span class="kw1">continue</span></a><span class="sy0">.</span>
        <a href="http://help.sap.com/abapdocu/en/ABAPENDIF.htm"><span class="kw1">endif</span></a><span class="sy0">.</span>
&nbsp;
<span class="co2">*       Get Filesize</span>
        <span class="kw8">call function</span> <span class="st0">'WWWPARAMS_READ'</span>
          <span class="kw4">exporting</span>
            relid  <span class="sy1">=</span> <span class="sy1">&lt;</span>obj<span class="sy1">&gt;</span><span class="sy0">-</span>relid
            objid  <span class="sy1">=</span> <span class="sy1">&lt;</span>obj<span class="sy1">&gt;</span><span class="sy0">-</span>objid
            <span class="kw4">name</span>   <span class="sy1">=</span> <span class="st0">'filesize'</span>
          <span class="kw4">importing</span>
            <span class="kw4">value</span>  <span class="sy1">=</span> lf_param
          <span class="kw4">exceptions</span>
            <span class="kw4">others</span> <span class="sy1">=</span> <span class="nu0">1</span><span class="sy0">.</span>
        <a href="http://help.sap.com/abapdocu/en/ABAPIF.htm"><span class="kw1">if</span></a> sy<span class="sy0">-</span>subrc <span class="sy1">=</span> <span class="nu0">0</span><span class="sy0">.</span>
          lf_filesize <span class="sy1">=</span> lf_param<span class="sy0">.</span>
        <a href="http://help.sap.com/abapdocu/en/ABAPELSE.htm"><span class="kw1">else</span></a><span class="sy0">.</span>
          <a href="http://help.sap.com/abapdocu/en/ABAPFORMAT.htm"><span class="kw3">format</span></a> <span class="kw4">color</span> <span class="kw4">col_negative</span> <span class="kw4">intensified</span> on<span class="sy0">.</span>
          <a href="http://help.sap.com/abapdocu/en/ABAPWRITE.htm"><span class="kw3">write</span></a><span class="sy0">:</span> <span class="sy0">/</span> <span class="st0">'Fehler beim Lesen aus der Datenbank'</span><span class="sy0">.</span>
          <a href="http://help.sap.com/abapdocu/en/ABAPFORMAT.htm"><span class="kw3">format</span></a> <span class="kw4">color</span> <span class="kw4">col_background</span> <span class="kw4">intensified</span> <span class="kw4">off</span><span class="sy0">.</span>
          <a href="http://help.sap.com/abapdocu/en/ABAPCONTINUE.htm"><span class="kw1">continue</span></a><span class="sy0">.</span>
        <a href="http://help.sap.com/abapdocu/en/ABAPENDIF.htm"><span class="kw1">endif</span></a><span class="sy0">.</span>
&nbsp;
        <span class="kw8">call function</span> <span class="st0">'GUI_DOWNLOAD'</span>
          <span class="kw4">exporting</span>
            bin_filesize <span class="sy1">=</span> lf_filesize
            filename     <span class="sy1">=</span> lf_filename
            filetype     <span class="sy1">=</span> <span class="st0">'BIN'</span>
          <a href="http://help.sap.com/abapdocu/en/ABAPTABLES.htm"><span class="kw2">tables</span></a>
            data_tab     <span class="sy1">=</span> lt_data
          <span class="kw4">exceptions</span>
            <span class="kw4">others</span>       <span class="sy1">=</span> <span class="nu0">1</span><span class="sy0">.</span>
        <a href="http://help.sap.com/abapdocu/en/ABAPIF.htm"><span class="kw1">if</span></a> sy<span class="sy0">-</span>subrc <span class="sy1">&lt;&gt;</span> <span class="nu0">0</span><span class="sy0">.</span>
          <a href="http://help.sap.com/abapdocu/en/ABAPFORMAT.htm"><span class="kw3">format</span></a> <span class="kw4">color</span> <span class="kw4">col_negative</span> <span class="kw4">intensified</span> on<span class="sy0">.</span>
          <a href="http://help.sap.com/abapdocu/en/ABAPWRITE.htm"><span class="kw3">write</span></a><span class="sy0">:</span> <span class="sy0">/</span> <span class="st0">'Fehler beim Schreiben der Datei'</span><span class="sy0">.</span>
          <a href="http://help.sap.com/abapdocu/en/ABAPFORMAT.htm"><span class="kw3">format</span></a> <span class="kw4">color</span> <span class="kw4">col_background</span> <span class="kw4">intensified</span> <span class="kw4">off</span><span class="sy0">.</span>
          <a href="http://help.sap.com/abapdocu/en/ABAPCONTINUE.htm"><span class="kw1">continue</span></a><span class="sy0">.</span>
        <a href="http://help.sap.com/abapdocu/en/ABAPELSE.htm"><span class="kw1">else</span></a><span class="sy0">.</span>
          <a href="http://help.sap.com/abapdocu/en/ABAPFORMAT.htm"><span class="kw3">format</span></a> <span class="kw4">color</span> <span class="kw4">col_positive</span> <span class="kw4">intensified</span> on<span class="sy0">.</span>
          <a href="http://help.sap.com/abapdocu/en/ABAPWRITE.htm"><span class="kw3">write</span></a><span class="sy0">:</span> <span class="sy0">/</span> <span class="st0">'Datei wurde exportiert'</span><span class="sy0">.</span>
          <a href="http://help.sap.com/abapdocu/en/ABAPFORMAT.htm"><span class="kw3">format</span></a> <span class="kw4">color</span> <span class="kw4">col_background</span> <span class="kw4">intensified</span> <span class="kw4">off</span><span class="sy0">.</span>
        <a href="http://help.sap.com/abapdocu/en/ABAPENDIF.htm"><span class="kw1">endif</span></a><span class="sy0">.</span>
&nbsp;
&nbsp;
      <a href="http://help.sap.com/abapdocu/en/ABAPENDIF.htm"><span class="kw1">endif</span></a><span class="sy0">.</span>
    <a href="http://help.sap.com/abapdocu/en/ABAPENDLOOP.htm"><span class="kw1">endloop</span></a><span class="sy0">.</span>
  <a href="http://help.sap.com/abapdocu/en/ABAPELSEIF.htm"><span class="kw1">elseif</span></a> p_act <span class="sy1">=</span> <span class="st0">'I'</span><span class="sy0">.</span>
    lf_path_new <span class="sy1">=</span> p_path<span class="sy0">.</span>
    <span class="kw8">call method</span> cl_gui_frontend_services<span class="sy0">=&gt;</span><span class="me2">directory_list_files</span>
      <span class="kw4">exporting</span>
        directory  <span class="sy1">=</span> lf_path_new
        files_only <span class="sy1">=</span> <span class="st0">'X'</span>
      <span class="kw4">changing</span>
        file_table <span class="sy1">=</span> lt_files
        <span class="kw4">count</span>      <span class="sy1">=</span> lf_count
      <span class="kw4">exceptions</span>
        <span class="kw4">others</span>     <span class="sy1">=</span> <span class="nu0">1</span><span class="sy0">.</span>
    <a href="http://help.sap.com/abapdocu/en/ABAPIF.htm"><span class="kw1">if</span></a> sy<span class="sy0">-</span>subrc <span class="sy1">&lt;&gt;</span> <span class="nu0">0</span><span class="sy0">.</span>
      <a href="http://help.sap.com/abapdocu/en/ABAPMESSAGE.htm"><span class="kw3">message</span></a> <span class="kw4">id</span> sy<span class="sy0">-</span>msgid <span class="kw4">type</span> sy<span class="sy0">-</span>msgty <span class="kw4">number</span> sy<span class="sy0">-</span>msgno
                <span class="kw4">with</span> sy<span class="sy0">-</span>msgv1 sy<span class="sy0">-</span>msgv2 sy<span class="sy0">-</span>msgv3 sy<span class="sy0">-</span>msgv4<span class="sy0">.</span>
      <a href="http://help.sap.com/abapdocu/en/ABAPEXIT.htm"><span class="kw1">exit</span></a><span class="sy0">.</span>
    <a href="http://help.sap.com/abapdocu/en/ABAPENDIF.htm"><span class="kw1">endif</span></a><span class="sy0">.</span>
&nbsp;
    <span class="kw7">loop at</span> lt_files <span class="kw4">assigning</span> <span class="sy1">&lt;</span>file<span class="sy1">&gt;</span><span class="sy0">.</span>
      lf_param <span class="sy1">=</span> <span class="sy1">&lt;</span>file<span class="sy1">&gt;</span><span class="sy0">.</span>
&nbsp;
      <span class="kw8">call function</span> <span class="st0">'CV120_SPLIT_FILE'</span>
        <span class="kw4">exporting</span>
          pf_file  <span class="sy1">=</span> lf_param
        <span class="kw4">importing</span>
          pfx_file <span class="sy1">=</span> lf_param<span class="sy0">.</span>
&nbsp;
      lf_objid <span class="sy1">=</span> lf_param<span class="sy0">.</span>
&nbsp;
      <a href="http://help.sap.com/abapdocu/en/ABAPTRANSLATE.htm"><span class="kw3">translate</span></a> lf_objid <span class="kw4">using</span> <span class="st0">'¦/'</span><span class="sy0">.</span>
&nbsp;
<span class="co2">*     Passt name?</span>
      <a href="http://help.sap.com/abapdocu/en/ABAPCHECK.htm"><span class="kw1">check</span></a> lf_objid <span class="kw4">in</span> p_name<span class="sy0">.</span>
&nbsp;
<span class="co2">*     Gibt es die Datei im Repositoy und passt die DevClass</span>
      <a href="http://help.sap.com/abapdocu/en/ABAPSELECT.htm"><span class="kw3">select</span></a> <span class="sy0">*</span> <span class="kw4">from</span> wwwdata <span class="kw4">as</span> f <span class="kw4">inner</span> <span class="kw4">join</span> tadir <span class="kw4">as</span> p
        on f~objid <span class="sy1">=</span> p~obj_name
        <span class="kw4">into</span>  <span class="kw9">corresponding <a href="http://help.sap.com/abapdocu/en/ABAPFIELDS.htm"><span class="kw2">fields</span></a> <span class="kw4">of</span> table</span> lt_objects
        <span class="kw9">up to</span> <span class="nu0">1</span> <span class="kw4">rows</span>
        <span class="kw4">where</span> f~srtf2 <span class="sy1">=</span> <span class="nu0">0</span>
        <span class="kw4">and</span>   f~relid <span class="sy1">=</span> <span class="st0">'MI'</span>
        <span class="kw4">and</span>   p~pgmid    <span class="sy1">=</span> <span class="st0">'R3TR'</span>
        <span class="kw4">and</span>   p~object   <span class="sy1">=</span> <span class="st0">'W3MI'</span>
        <span class="kw4">and</span>   p~devclass <span class="kw4">in</span> p_devc
        <span class="kw4">and</span>   p~obj_name <span class="sy1">=</span> lf_objid<span class="sy0">.</span>
&nbsp;
      <a href="http://help.sap.com/abapdocu/en/ABAPIF.htm"><span class="kw1">if</span></a> sy<span class="sy0">-</span>subrc <span class="sy1">&lt;&gt;</span> <span class="nu0">0</span><span class="sy0">.</span>
        <a href="http://help.sap.com/abapdocu/en/ABAPIF.htm"><span class="kw1">if</span></a> p_create <span class="sy1">=</span> <span class="kw4">space</span><span class="sy0">.</span>
          <a href="http://help.sap.com/abapdocu/en/ABAPCONTINUE.htm"><span class="kw1">continue</span></a><span class="sy0">.</span>
        <a href="http://help.sap.com/abapdocu/en/ABAPELSE.htm"><span class="kw1">else</span></a><span class="sy0">.</span>
          lf_new <span class="sy1">=</span> <span class="st0">'X'</span><span class="sy0">.</span>
          <a href="http://help.sap.com/abapdocu/en/ABAPAPPEND.htm"><span class="kw3">append</span></a> <span class="kw9">initial line</span> <span class="kw4">to</span> lt_objects <span class="kw4">assigning</span> <span class="sy1">&lt;</span>obj<span class="sy1">&gt;</span><span class="sy0">.</span>
          <span class="sy1">&lt;</span>obj<span class="sy1">&gt;</span><span class="sy0">-</span>relid    <span class="sy1">=</span> <span class="st0">'MI'</span><span class="sy0">.</span>
          <span class="sy1">&lt;</span>obj<span class="sy1">&gt;</span><span class="sy0">-</span>objid    <span class="sy1">=</span> lf_objid<span class="sy0">.</span>
        <a href="http://help.sap.com/abapdocu/en/ABAPENDIF.htm"><span class="kw1">endif</span></a><span class="sy0">.</span>
      <a href="http://help.sap.com/abapdocu/en/ABAPELSE.htm"><span class="kw1">else</span></a><span class="sy0">.</span>
        lf_new <span class="sy1">=</span> <span class="kw4">space</span><span class="sy0">.</span>
      <a href="http://help.sap.com/abapdocu/en/ABAPENDIF.htm"><span class="kw1">endif</span></a><span class="sy0">.</span>
&nbsp;
      <a href="http://help.sap.com/abapdocu/en/ABAPWRITE.htm"><span class="kw3">write</span></a><span class="sy0">:</span> <span class="sy0">/</span> lf_objid<span class="sy0">.</span>
&nbsp;
      <a href="http://help.sap.com/abapdocu/en/ABAPCHECK.htm"><span class="kw1">check</span></a> p_test <span class="sy1">=</span> <span class="kw4">space</span><span class="sy0">.</span>
&nbsp;
      <span class="kw8">read table</span> lt_objects <span class="kw4">assigning</span> <span class="sy1">&lt;</span>obj<span class="sy1">&gt;</span> <span class="kw4">index</span> <span class="nu0">1</span><span class="sy0">.</span>
&nbsp;
      <a href="http://help.sap.com/abapdocu/en/ABAPCONCATENATE.htm"><span class="kw3">concatenate</span></a> p_path <span class="sy1">&lt;</span>file<span class="sy1">&gt;</span> <span class="kw4">into</span> lf_param<span class="sy0">.</span>
      <span class="kw8">call function</span> <span class="st0">'UPLOAD_WEB_OBJECT'</span>
        <span class="kw4">exporting</span>
          <span class="kw4">key</span>  <span class="sy1">=</span> <span class="sy1">&lt;</span>obj<span class="sy1">&gt;</span>
          temp <span class="sy1">=</span> lf_param
        <span class="kw4">importing</span>
          rc   <span class="sy1">=</span> lf_subrc<span class="sy0">.</span>
      <a href="http://help.sap.com/abapdocu/en/ABAPIF.htm"><span class="kw1">if</span></a> lf_subrc <span class="sy1">&lt;&gt;</span> <span class="nu0">0</span><span class="sy0">.</span>
        <a href="http://help.sap.com/abapdocu/en/ABAPFORMAT.htm"><span class="kw3">format</span></a> <span class="kw4">color</span> <span class="kw4">col_negative</span> <span class="kw4">intensified</span> on<span class="sy0">.</span>
        <a href="http://help.sap.com/abapdocu/en/ABAPWRITE.htm"><span class="kw3">write</span></a><span class="sy0">:</span> <span class="sy0">/</span> <span class="st0">'Fehler beim Schreiben der Datenbank'</span><span class="sy0">.</span>
        <a href="http://help.sap.com/abapdocu/en/ABAPFORMAT.htm"><span class="kw3">format</span></a> <span class="kw4">color</span> <span class="kw4">col_background</span> <span class="kw4">intensified</span> <span class="kw4">off</span><span class="sy0">.</span>
        <a href="http://help.sap.com/abapdocu/en/ABAPCONTINUE.htm"><span class="kw1">continue</span></a><span class="sy0">.</span>
      <a href="http://help.sap.com/abapdocu/en/ABAPELSE.htm"><span class="kw1">else</span></a><span class="sy0">.</span>
        <a href="http://help.sap.com/abapdocu/en/ABAPFORMAT.htm"><span class="kw3">format</span></a> <span class="kw4">color</span> <span class="kw4">col_positive</span> <span class="kw4">intensified</span> on<span class="sy0">.</span>
        <a href="http://help.sap.com/abapdocu/en/ABAPIF.htm"><span class="kw1">if</span></a> lf_new <span class="sy1">=</span> <span class="st0">'X'</span><span class="sy0">.</span>
          <a href="http://help.sap.com/abapdocu/en/ABAPWRITE.htm"><span class="kw3">write</span></a><span class="sy0">:</span> <span class="sy0">/</span> <span class="st0">'Objekt wurde neu angelegt und Datei wurde importiert'</span><span class="sy0">.</span>
        <a href="http://help.sap.com/abapdocu/en/ABAPELSE.htm"><span class="kw1">else</span></a><span class="sy0">.</span>
          <a href="http://help.sap.com/abapdocu/en/ABAPWRITE.htm"><span class="kw3">write</span></a><span class="sy0">:</span> <span class="sy0">/</span> <span class="st0">'Datei wurde importiert'</span><span class="sy0">.</span>
        <a href="http://help.sap.com/abapdocu/en/ABAPENDIF.htm"><span class="kw1">endif</span></a><span class="sy0">.</span>
        <a href="http://help.sap.com/abapdocu/en/ABAPFORMAT.htm"><span class="kw3">format</span></a> <span class="kw4">color</span> <span class="kw4">col_background</span> <span class="kw4">intensified</span> <span class="kw4">off</span><span class="sy0">.</span>
      <a href="http://help.sap.com/abapdocu/en/ABAPENDIF.htm"><span class="kw1">endif</span></a><span class="sy0">.</span>
&nbsp;
    <a href="http://help.sap.com/abapdocu/en/ABAPENDLOOP.htm"><span class="kw1">endloop</span></a><span class="sy0">.</span>
&nbsp;
  <a href="http://help.sap.com/abapdocu/en/ABAPENDIF.htm"><span class="kw1">endif</span></a><span class="sy0">.</span>
&nbsp;
<a href="http://help.sap.com/abapdocu/en/ABAPEND-OF-SELECTION.htm"><span class="kw3">end-of-selection</span></a><span class="sy0">.</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.faebusoft.ch/sap/exportimport-von-sap-web-repository-objekten/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Versionshistorie beim Import</title>
		<link>http://www.faebusoft.ch/sap/tipstricks/versionshistorie-beim-import/</link>
		<comments>http://www.faebusoft.ch/sap/tipstricks/versionshistorie-beim-import/#comments</comments>
		<pubDate>Thu, 25 Aug 2011 06:59:19 +0000</pubDate>
		<dc:creator>faebu</dc:creator>
				<category><![CDATA[ABAP Entwicklung]]></category>
		<category><![CDATA[Tips & Tricks]]></category>

		<guid isPermaLink="false">http://www.faebusoft.ch/?p=171</guid>
		<description><![CDATA[Beim Import von Workbenchobjekten geht grundsätzlich die gesamte Versionhistorie verloren. Dies wird spätestens dann zum Problem, wenn man mehrere Entwicklungs- oder auch Sandbox Systeme im Einsatz hat. Dieses Verhalten kann glücklicherweise geändert werden. Es wird im Rahmen der Systemkonfiguration des Transport Management Systems eingestellt: Transaktion STMS starten Menü Übersicht » Systeme Entsprechendes System auswählen und [...]]]></description>
			<content:encoded><![CDATA[<p>Beim Import von Workbenchobjekten geht grundsätzlich die gesamte Versionhistorie verloren. Dies wird spätestens dann zum Problem, wenn man mehrere Entwicklungs- oder auch Sandbox Systeme im Einsatz hat.</p>
<p><span id="more-171"></span></p>
<p>Dieses Verhalten kann glücklicherweise geändert werden. Es wird im Rahmen der Systemkonfiguration des Transport Management Systems eingestellt:</p>
<ul>
<li>Transaktion <em>STMS</em> starten</li>
<li>Menü <em>Übersicht » Systeme</em></li>
<li>Entsprechendes System auswählen und dann im Menü <em>SAP-System » Ändern</em> die Bearbeitung starten</li>
<li>Wechsel ins Register <em>Transporttool</em></li>
<li>Den neuen Parameter <em>VERS_AT_IMP</em> anlegen und mit dem Wert <em>ALWAYS</em> versehen</li>
</ul>
<p>Fertig!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.faebusoft.ch/sap/tipstricks/versionshistorie-beim-import/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hattrick Dashboard V1.2 veröffentlicht</title>
		<link>http://www.faebusoft.ch/android-entwicklung/hattrick-dashboard-v1-2-veroffentlicht/</link>
		<comments>http://www.faebusoft.ch/android-entwicklung/hattrick-dashboard-v1-2-veroffentlicht/#comments</comments>
		<pubDate>Fri, 13 May 2011 09:41:37 +0000</pubDate>
		<dc:creator>faebu</dc:creator>
				<category><![CDATA[Android Entwicklung]]></category>

		<guid isPermaLink="false">http://www.faebusoft.ch/?p=169</guid>
		<description><![CDATA[Die neuste Version von Hattrick Dashboard wurde am 12. Mai freigegeben. Die neue Version beinhaltet einige neue Features. Neu informiert Hattrick Dashboard automatisch, wenn Du ein Tor geschossen oder erhalten hast und wenn eine Partie zu Ende ist. Dieses Feature ist noch im Beta Stadium, da es praktisch unmöglich ist dies ausgiebig zu testen (Tests [...]]]></description>
			<content:encoded><![CDATA[<p>Die neuste Version von Hattrick Dashboard wurde am 12. Mai freigegeben. Die neue Version beinhaltet einige neue Features.</p>
<p><span id="more-169"></span>Neu informiert Hattrick Dashboard automatisch, wenn Du ein Tor geschossen oder erhalten hast und wenn eine Partie zu Ende ist. Dieses Feature ist noch im Beta Stadium, da es praktisch unmöglich ist dies ausgiebig zu testen (Tests sind leider nur möglich während meinen beiden Spielen).</p>
<p>Weiter können nun die Stadiondetails und die gesamte Bilanz des Vereins angezeigt werden. Die bereits mit V1.1 eingeführte Detailsicht der gespielten Spiele kann nun &#8211; Dashboard-like &#8211; angepasst werden. Blöcke können anders angeordnet und ausgeschaltet werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.faebusoft.ch/android-entwicklung/hattrick-dashboard-v1-2-veroffentlicht/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Verteilte Vorlagen in Microsoft Word</title>
		<link>http://www.faebusoft.ch/entwicklung/verteilte-vorlagen-in-microsoft-word/</link>
		<comments>http://www.faebusoft.ch/entwicklung/verteilte-vorlagen-in-microsoft-word/#comments</comments>
		<pubDate>Thu, 31 Mar 2011 08:22:22 +0000</pubDate>
		<dc:creator>faebu</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Office Entwicklung]]></category>

		<guid isPermaLink="false">http://www.faebusoft.ch/?p=168</guid>
		<description><![CDATA[Arbeiten verschiedene Benutzer mit Vorlagen, welche nicht zentral als Arbeitsgruppenvorlagen verfügbar, sondern nur lokal vorhanden sind, kommt es immer wieder zu Problemen, weil der Pfad der Vorlagen von Client zu Client oftmals abweicht und so möglicherweise wichtige Funktionen der Vorlage nicht mehr zu Verfügung stehen. Um dieses Problem in den Griff zu bekommen habe ich [...]]]></description>
			<content:encoded><![CDATA[<p>Arbeiten verschiedene Benutzer mit Vorlagen, welche nicht zentral als Arbeitsgruppenvorlagen verfügbar, sondern nur lokal vorhanden sind, kommt es immer wieder zu Problemen, weil der Pfad der Vorlagen von Client zu Client oftmals abweicht und so möglicherweise wichtige Funktionen der Vorlage nicht mehr zu Verfügung stehen. Um dieses Problem in den Griff zu bekommen habe ich ein kleines Microsoft Word Add-In geschrieben, welches prüft, ob die Vorlage vorhanden ist und sonst in den Vorlagenverzeichnissen danach sucht und die Referenz repariert.<br />
<span id="more-168"></span></p>
<h2>Add-In</h2>
<p>Ein einfaches Word Add-In ist nichts weiter als ein Word Vorlage, welche im STARTUP Verzeichnis von Microsoft Word abgelegt wird und somit automatisch gestartet wird. Für die Erzeugung des Add-Ins kann man also einfach ein neues Dokument anlegen und diese mit dem <em>Speichern unter&#8230; </em>Dialog als Vorlagendokument abspeichern.</p>
<p>Für das Add-In wird ein Klassenmodul benötigt, das wir <em>clsEventHandler </em>nennen und ein weiteres &#8220;normales&#8221; Modul, indem wird das eigentliche Vorlagenhandling implementieren. Das Klassenmodul wird benötigt für die Implementierung des Event-Handlers, welcher jedesmal reagiert, wenn ein Dokumente geöffnet wird und die Prüfung der verknüpften Vorlage auslöst.</p>
<h3>Klassenmodul clsEventHandler</h3>
<p>Im Klassenmodul erzeugen wir lediglich ein Klassenobjekt, dass auf Events von einem Word-Objekt reagieren kann und implementieren hierzu die entsprechende Prozedur für das Abfangen des Öffnen-Ereignis. In der Prozedur rufen wir eine weitere Prozedur <em>FixTemplate</em> auf, welche jedoch in das &#8220;normale&#8221; Modul ausgelagert wird und welches die eigenltiche Vorlagenlogik übernimmt.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="vb"><span class="kw2">Option</span> <span class="kw2">Explicit</span>
&nbsp;
<span class="kw2">Public</span> <span class="kw3">WithEvents</span> _
   MyWordEvents _
   <span class="kw4">As</span> Word.Application
&nbsp;
<span class="kw2">Private</span> <span class="kw2">Sub</span> MyWordEvents_DocumentOpen(<span class="kw4">ByVal</span> Doc <span class="kw4">As</span> Document)
    FixTemplate
<span class="kw3">End</span> <span class="kw2">Sub</span></pre></td></tr></table></div>

<h3>Vorlagenlogik</h3>
<p>Der Ablauf der Vorlagenprüfung ist relativ einfach. Zuerst wird vom aktuellen Dokument die verknüpfte Vorlage ermittelt. Dabei darf man jedoch nicht wie zu erwarten wäre, auf das Attribut <em>AttachedTemplate </em>zurückgreifen. Hier steht die Vorlage nämlich nur korrekt drin, wenn sie auch vorhanden ist. Ist die Vorlage jedoch nicht vorhanden, verweist dieses Attribut auf die Vorlage Normal.dot.</p>
<p>Abhilfe schafft hier der Zugriff über den Vorlagen-Verknüpfungs-Dialog, welcher die Originalverknüpfung des Dokuments zurückgibt.</p>

<div class="wp_syntax"><div class="code"><pre class="vb">strTemplate = Dialogs(wdDialogToolsTemplates).Template</pre></div></div>

<p>Im nächsten Schritt muss geprüft werden, ob die Vorlage existiert. Dies geschieht am einfachsten über eine Instanz von <em>FileSystemObject.</em></p>
<p>If objFS.FileExists(strTemplate) = False Then</p>
<p>Existiert die Datei nicht, dann wird nun versucht die Vorlagenverzeichnisse des Benutzers nach dem Dateinamen der Vorlage zu durchsuchen und eine gleich benannte Vorlage mit dem Dokument zu verknüpfen. Als erstes müssen die entsprechenden Vorlagenverzeichnisse ermittelt werden. Dies geschieht über Word Optionen.</p>

<div class="wp_syntax"><div class="code"><pre class="vb">strWGDir = Options.DefaultFilePath(wdWorkgroupTemplatesPath)
strUDir = Options.DefaultFilePath(wdUserTemplatesPath)</pre></div></div>

<p>Das eigentliche Durchsuchen erfolgt dann in einer separaten Funktion, weil diese rekursiv aufgerufen werden muss, um die ganze Verzeichnisstruktur unterhalb der Vorlagenverzeichnisse prüfen zu können.</p>
<p>Das Gesamte Coding dieser Prozedur sieht wie folgt aus:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
</pre></td><td class="code"><pre class="vb"><span class="kw2">Public</span> <span class="kw2">Sub</span> FixTemplate()
    <span class="kw4">Dim</span> objFS <span class="kw4">As</span> <span class="kw2">New</span> FileSystemObject
    <span class="kw4">Dim</span> strTemplate <span class="kw4">As</span> <span class="kw1">String</span>
    <span class="kw4">Dim</span> strFile <span class="kw4">As</span> <span class="kw1">String</span>
    <span class="kw4">Dim</span> strWGDir <span class="kw4">As</span> <span class="kw1">String</span>
    <span class="kw4">Dim</span> strUDir <span class="kw4">As</span> <span class="kw1">String</span>
    <span class="kw4">Dim</span> strFileNew <span class="kw4">As</span> <span class="kw1">String</span>
&nbsp;
    <span class="kw4">On</span> <span class="kw4">Error</span> <span class="kw3">GoTo</span> FixTemplate_error
&nbsp;
    <span class="co1">'Get assigned template from dialog!
</span>    strTemplate = Dialogs(wdDialogToolsTemplates).Template
&nbsp;
    <span class="kw3">If</span> strTemplate = <span class="st0">&quot;&quot;</span> <span class="kw3">Then</span>
        <span class="kw3">GoTo</span> FixTemplate_exit
    <span class="kw3">End</span> <span class="kw3">If</span>
&nbsp;
    <span class="kw3">If</span> objFS.FileExists(strTemplate) = <span class="kw5">False</span> <span class="kw3">Then</span>
        <span class="co1">'Get Filename
</span>        strFile = objFS.GetFileName(strTemplate)
&nbsp;
        <span class="co1">'First look in Workgroup templates
</span>        strWGDir = Options.DefaultFilePath(wdWorkgroupTemplatesPath)
        <span class="kw3">If</span> strWGDir &lt;&gt; <span class="st0">&quot;&quot;</span> <span class="kw3">Then</span>
            strFileNew = CheckTemplate(strWGDir, strFile)
            <span class="kw3">If</span> strFileNew &lt;&gt; <span class="st0">&quot;&quot;</span> <span class="kw3">Then</span>
                ActiveDocument.AttachedTemplate = strFileNew
                <span class="kw3">GoTo</span> FixTemplate_exit
            <span class="kw3">End</span> <span class="kw3">If</span>
        <span class="kw3">End</span> <span class="kw3">If</span>
&nbsp;
        strUDir = Options.DefaultFilePath(wdUserTemplatesPath)
        <span class="kw3">If</span> strUDir &lt;&gt; <span class="st0">&quot;&quot;</span> <span class="kw3">Then</span>
            strFileNew = CheckTemplate(strUDir, strFile)
            <span class="kw3">If</span> strFileNew &lt;&gt; <span class="st0">&quot;&quot;</span> <span class="kw3">Then</span>
                ActiveDocument.AttachedTemplate = strFileNew
                <span class="kw3">GoTo</span> FixTemplate_exit
            <span class="kw3">End</span> <span class="kw3">If</span>
        <span class="kw3">End</span> <span class="kw3">If</span>
    <span class="kw3">End</span> <span class="kw3">If</span>
&nbsp;
FixTemplate_exit:
    <span class="kw4">Set</span> objFS = <span class="kw5">Nothing</span>
    <span class="kw3">If</span> ActiveDocument.Saved = <span class="kw5">False</span> <span class="kw3">Then</span>
        ActiveDocument.Save
    <span class="kw3">End</span> <span class="kw3">If</span>
&nbsp;
    <span class="kw2">Exit</span> <span class="kw2">Sub</span>
&nbsp;
FixTemplate_error:
    <span class="co1">'Beim Zuweisen gibt es unter Umständen ein Fehler, wenn die Vorlage auf ein Objekt
</span>    <span class="co1">'verweist, welches irgendwie bereits geöffnet ist.
</span>    <span class="kw4">Resume</span> FixTemplate_exit
<span class="kw3">End</span> <span class="kw2">Sub</span></pre></td></tr></table></div>

<p>Anhand des Coding ist die Ablauflogik gut erkennbar. Wichtig an dieser Stelle ist der Error-Handler. In meinen Tests wurde mehrmals ein Fehler ausgelöst beim Zuweisen der Vorlage mit der Zeile</p>

<div class="wp_syntax"><div class="code"><pre class="vb">ActiveDocument.AttachedTemplate = strFileNew</pre></div></div>

<p>Der Grund für den Fehler ist wohl bei der Vorlage zu suchen, welche wiederum Referenzen aufweist, welche bereits geladen/geöffnet sind. Die exakte Fehlerursache ist mir jedoch nicht klar, einen Einfluss auf die Zuweisung der Vorlage hat der Fehler jedoch nicht.</p>
<h3>Rekursive Suche</h3>
<p>Auch das &#8220;Scannen&#8221; der Verzeichnisse geht über eine Instanz vom <em>FileSystemObject</em>. Für das Auffinden der Vorlage werden zuerst alle Dateien im Verzeichnis gelesen und deren Dateiname verglichen. Anschliessend erfolgt die Abarbeitung sämtlicher Unterverzeichnisse, indem die Funktion rekursiv aufgerufen wird.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="code"><pre class="vb"><span class="kw2">Public</span> <span class="kw2">Function</span> CheckTemplate(dir <span class="kw4">As</span> <span class="kw1">String</span>, filename <span class="kw4">As</span> <span class="kw1">String</span>)
    <span class="kw4">Dim</span> objFS <span class="kw4">As</span> <span class="kw2">New</span> FileSystemObject
    <span class="kw4">Dim</span> objFolder <span class="kw4">As</span> folder
    <span class="kw4">Dim</span> objSubFolder <span class="kw4">As</span> folder
    <span class="kw4">Dim</span> objFile <span class="kw4">As</span> file
&nbsp;
    <span class="kw4">Set</span> objFolder = objFS.GetFolder(dir)
    <span class="kw3">For</span> <span class="kw3">Each</span> objFile <span class="kw3">In</span> objFolder.Files
        <span class="kw3">If</span> objFile.Name = filename <span class="kw3">Then</span>
            PNCheckTemplate = dir &amp; <span class="st0">&quot;\&quot;</span> &amp; filename
            <span class="kw2">Exit</span> <span class="kw2">Function</span>
        <span class="kw3">End</span> <span class="kw3">If</span>
    <span class="kw3">Next</span>
&nbsp;
    <span class="kw3">For</span> <span class="kw3">Each</span> objSubFolder <span class="kw3">In</span> objFolder.SubFolders
        CheckTemplate = CheckTemplate(objSubFolder.Path, filename)
        <span class="kw3">If</span> CheckTemplate &lt;&gt; <span class="st0">&quot;&quot;</span> <span class="kw3">Then</span>
            <span class="kw2">Exit</span> <span class="kw2">Function</span>
        <span class="kw3">End</span> <span class="kw3">If</span>
    <span class="kw3">Next</span>
<span class="kw3">End</span> <span class="kw2">Function</span></pre></td></tr></table></div>

<h3>Add-In initialisieren</h3>
<p>Damit das Add-In auch seinen Dienst verrichtet, muss es noch sauber initialisiert werden. Hierzu steht die Prozedur <em>AutoExec</em> zu Verfügung, welche gestartet wird, sobald das Add-In geladen wird. Die Prozedur wird von Hand im Dokument (Objekt ThisDocument) angelegt und erzeugt eine Instanz von der Ereignisklasse, welche dadurch erst geladen wird und ab dann auf das benötigte Ereignis reagieren kann.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="vb"><span class="kw4">Dim</span> objEventHandler <span class="kw4">As</span> clsEventHandler
&nbsp;
<span class="kw2">Sub</span> AutoExec()
   <span class="kw4">Set</span> objEventHandler = <span class="kw2">New</span> clsEventHandler
   <span class="kw4">Set</span> objEventHandler.MyWordEvents = Word.Application
<span class="kw3">End</span> <span class="kw2">Sub</span>
&nbsp;
<span class="kw2">Sub</span> AutoExit()
   <span class="kw4">Set</span> objEventHandler = <span class="kw5">Nothing</span>
<span class="kw3">End</span> <span class="kw2">Sub</span></pre></td></tr></table></div>

<h2>Fazit</h2>
<p>Mit diesem einfachen Add-In hat man verteilte Vorlagen im Griff und Dokumente funktionieren auf allen Clients wie erwartet. Voraussetzung ist natürlich, dass alle Benutzer dieselben Vorlagen verwenden und die Dateinamen der Vorlagen nicht verändern. Am besten hat man dies im Griff, wenn man die Vorlagen nicht von Hand sondern über eine Setup Routine verteilt. Hierzu habe ich schon vor längerer Zeit den Artikel <em><a title="Word Vorlagen und Startup Pfad in Inno Setup" href="http://www.faebusoft.ch/entwicklung/word-vorlagen-und-startup-pfad-in-inno-setup/">Word Vorlagen und Startup Pfad in Inno Setup</a></em> erfasst.</p>
<h2>Download</h2>
<p class="icon download"><a href="http://www.faebusoft.ch/wp-content/downloads/faebusoft_TemplateFix_v1.0.zip">faebusoft_TemplateFix_v1.0.zip</a><br />
<small>von faebusoft.ch</small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.faebusoft.ch/entwicklung/verteilte-vorlagen-in-microsoft-word/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RFC-Bausteine über Webservice mit PHP aufrufen (Variante 2)</title>
		<link>http://www.faebusoft.ch/sap/schnittstellen-programmierung/rfc-bausteine-%c3%bcber-webservice-mit-php-aufrufen-variante-2/</link>
		<comments>http://www.faebusoft.ch/sap/schnittstellen-programmierung/rfc-bausteine-%c3%bcber-webservice-mit-php-aufrufen-variante-2/#comments</comments>
		<pubDate>Wed, 09 Mar 2011 15:08:49 +0000</pubDate>
		<dc:creator>faebu</dc:creator>
				<category><![CDATA[ABAP Entwicklung]]></category>
		<category><![CDATA[Schnittstellen-Programmierung]]></category>
		<category><![CDATA[Webentwicklung]]></category>

		<guid isPermaLink="false">http://www.faebusoft.ch/?p=164</guid>
		<description><![CDATA[In diesem Artikel habe ich beschrieben, wie mittels PHP und dem PEAR SOAP Paket ein SAP Webservice aufgerufen werden kann. Mittlerweile ist SOAP bei PHP mit dabei und die Installation des entsprechenden PEAR Paketes wird dadurch hinfällig. Die Vorbereitungen werden dadurch einfacher, aber auch hier kommt man nicht ganz so einfach ans Ziel wie am [...]]]></description>
			<content:encoded><![CDATA[<p>In <a title="RFC-Bausteine über Webservice mit PHP aufrufen" href="http://www.faebusoft.ch/sap/rfc-bausteine-uber-webservice-mit-php-aufrufen/">diesem Artikel</a> habe ich beschrieben, wie mittels PHP und dem PEAR SOAP Paket ein SAP Webservice aufgerufen werden kann. Mittlerweile ist SOAP bei PHP mit dabei und die Installation des entsprechenden PEAR Paketes wird dadurch hinfällig. Die Vorbereitungen werden dadurch einfacher, aber auch hier kommt man nicht ganz so einfach ans Ziel wie am Anfang vermutet.  <span id="more-164"></span></p>
<h2>Vorbereitungen</h2>
<p>Voraussetzung für die Nutzung von RFC Bausteinen als Webservice ist die  Aktivierung von zwei Service Knoten. Es handelt sich hierbei um die  Knoten <em>/sap/bc/soap/rfc</em> und <em>/sap/bc/soap/wdsl</em>, die mit der Transaktion <em>SICF </em>aktiviert werden müssen. Damit sind die Voraussetzungen soweit schon mal gegeben.  Da SOAP Klassen mittlerweile mit PHP ausgeliefert werden, sind keine weiteren Vorkehrungen notwendig. Es kann grundsätzlich direkt mit der Klasse <em>SoapClient</em> begonnen werden.</p>
<h2>Authentifizierungsproblem</h2>
<p>Damit SAP den Inhalt der entsprechenden WSDL-Datei preisgibt, muss man sich bei der Anfrage authentifizieren. Man würde erwarten, dass die SOAP Klassen von PHP dies erledigen, denn schliesslich sind entsprechende Argumente für Benutzername und Passwort vorhanden. Bereits beim Versuch mit folgenden Zeilen Code die WSDL Datei abzuholen, kommt es aber zu einem Fehler.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="php"><span class="re0">$soap</span> <span class="sy0">=</span> <span class="kw2">new</span> SoapClient<span class="br0">&#40;</span><span class="st_h">'http://host:8000/sap/bc/soap/wsdl/?services=NAME_DES_RFC_BAUSTEINS&amp;sap-client=100'</span><span class="sy0">,</span> 
			<a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st_h">'login'</span><span class="sy0">=&gt;</span><span class="re0">$user</span><span class="sy0">,</span> <span class="st_h">'password'</span><span class="sy0">=&gt;</span><span class="re0">$pass</span><span class="br0">&#41;</span>
		<span class="br0">&#41;</span><span class="sy0">;</span></pre></td></tr></table></div>

<p>Nach einigen Recherchen habe ich herausgefunden, dass die Klasse <em>SoapClient </em>keine Authentifizierung beim Lesen der WSDL Datei unterstützt. Erst beim eigentlichen Aufruf des Webservices werden der Benutzername und das Passwort verwendet. Dies ist meines Wissen auch als Bug getrackt, wird also wohl früher oder später mal behoben werden.</p>
<h2>Umweg über cURL</h2>
<p>Damit wir nun aber dennoch an die benötigte WSDL Datei kommen, müssen wir einen Umweg über die cURL Funktionen machen, mit denen sich Verbindungen über das HTTP (und weitere) Protokoll bewerkstelligen lassen. Da wir es hier mit Klassen zu tun haben, können wir dies schön kapseln, indem wir die bestehende SOAP Klasse ableiten und den Konstruktor überschreiben. An dieser Stelle wird nun die WSDL Datei &#8220;manuell&#8221; beschafft und auf dem eigenen Server abgelegt, damit die Datei über eine URL ohne Authentifizierung möglich ist.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
</pre></td><td class="code"><pre class="php"><span class="kw2">class</span> SoapAuthClient <span class="kw2">extends</span> SoapClient <span class="br0">&#123;</span>	 
	<span class="kw2">private</span> <span class="re0">$cache_dir</span> <span class="sy0">=</span> <span class="st_h">'/htdocs/test/'</span><span class="sy0">;</span> <span class="co1">// Absolute path to dir</span>
	<span class="kw2">private</span> <span class="re0">$cache_url</span> <span class="sy0">=</span> <span class="st_h">'http://www.faebusoft.ch/test/'</span><span class="sy0">;</span> <span class="co1">// Public URL of the path</span>
&nbsp;
	<span class="kw2">function</span> SoapAuthClient<span class="br0">&#40;</span><span class="re0">$wdsl</span><span class="sy0">,</span> <span class="re0">$options</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span><span class="re0">$options</span><span class="br0">&#91;</span><span class="st_h">'login'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> 
			<a href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span><span class="re0">$options</span><span class="br0">&#91;</span><span class="st_h">'password'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
			<span class="re0">$file</span> <span class="sy0">=</span> <a href="http://www.php.net/md5"><span class="kw3">md5</span></a><span class="br0">&#40;</span><a href="http://www.php.net/uniqid"><span class="kw3">uniqid</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="st_h">'.xml'</span><span class="sy0">;</span>
&nbsp;
			<span class="kw1">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="re0">$fp</span> <span class="sy0">=</span> <a href="http://www.php.net/fopen"><span class="kw3">fopen</span></a><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">cache_dir</span><span class="sy0">.</span><span class="re0">$file</span><span class="sy0">,</span> <span class="st0">&quot;w&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">==</span> <span class="kw4">false</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
				<span class="kw1">throw</span> <span class="kw2">new</span> Exception<span class="br0">&#40;</span><span class="st_h">'Could not create local WDSL file ('</span><span class="sy0">.</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">cache_dir</span><span class="sy0">.</span><span class="re0">$file</span><span class="sy0">.</span><span class="st_h">')'</span><span class="br0">&#41;</span><span class="sy0">;</span>
			<span class="br0">&#125;</span>
&nbsp;
			<span class="re0">$ch</span> <span class="sy0">=</span> <a href="http://www.php.net/curl_init"><span class="kw3">curl_init</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
			<span class="re0">$credit</span> <span class="sy0">=</span> <span class="br0">&#40;</span><span class="re0">$options</span><span class="br0">&#91;</span><span class="st_h">'login'</span><span class="br0">&#93;</span><span class="sy0">.</span><span class="st_h">':'</span><span class="sy0">.</span><span class="re0">$options</span><span class="br0">&#91;</span><span class="st_h">'password'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span>
			<a href="http://www.php.net/curl_setopt"><span class="kw3">curl_setopt</span></a><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_URL<span class="sy0">,</span> <span class="re0">$wdsl</span><span class="br0">&#41;</span><span class="sy0">;</span>
			<a href="http://www.php.net/curl_setopt"><span class="kw3">curl_setopt</span></a><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_HTTPAUTH<span class="sy0">,</span> CURLAUTH_BASIC<span class="br0">&#41;</span><span class="sy0">;</span>
			<a href="http://www.php.net/curl_setopt"><span class="kw3">curl_setopt</span></a><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_USERPWD<span class="sy0">,</span> <span class="re0">$credit</span><span class="br0">&#41;</span><span class="sy0">;</span>
			<a href="http://www.php.net/curl_setopt"><span class="kw3">curl_setopt</span></a><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_TIMEOUT<span class="sy0">,</span> <span class="nu0">15</span><span class="br0">&#41;</span><span class="sy0">;</span>
			<a href="http://www.php.net/curl_setopt"><span class="kw3">curl_setopt</span></a><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_FILE<span class="sy0">,</span> <span class="re0">$fp</span><span class="br0">&#41;</span><span class="sy0">;</span>
			<span class="kw1">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="re0">$xml</span> <span class="sy0">=</span> <a href="http://www.php.net/curl_exec"><span class="kw3">curl_exec</span></a><span class="br0">&#40;</span><span class="re0">$ch</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">===</span> <span class="kw4">false</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
				<span class="co1">//curl_close($ch);</span>
				<a href="http://www.php.net/fclose"><span class="kw3">fclose</span></a><span class="br0">&#40;</span><span class="re0">$fp</span><span class="br0">&#41;</span><span class="sy0">;</span>
				<a href="http://www.php.net/unlink"><span class="kw3">unlink</span></a><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">cache_dir</span><span class="sy0">.</span><span class="re0">$file</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
				<span class="kw1">throw</span> <span class="kw2">new</span> Exception<span class="br0">&#40;</span><a href="http://www.php.net/curl_error"><span class="kw3">curl_error</span></a><span class="br0">&#40;</span><span class="re0">$ch</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
			<span class="br0">&#125;</span>
&nbsp;
			<a href="http://www.php.net/curl_close"><span class="kw3">curl_close</span></a><span class="br0">&#40;</span><span class="re0">$ch</span><span class="br0">&#41;</span><span class="sy0">;</span>
			<a href="http://www.php.net/fclose"><span class="kw3">fclose</span></a><span class="br0">&#40;</span><span class="re0">$fp</span><span class="br0">&#41;</span><span class="sy0">;</span>
			<span class="re0">$wdsl</span> <span class="sy0">=</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">cache_url</span><span class="sy0">.</span><span class="re0">$file</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
&nbsp;
		parent<span class="sy0">::</span>__construct<span class="br0">&#40;</span><span class="re0">$wdsl</span><span class="sy0">,</span> <span class="re0">$options</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
		<a href="http://www.php.net/unlink"><span class="kw3">unlink</span></a><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">cache_dir</span><span class="sy0">.</span><span class="re0">$file</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></td></tr></table></div>

<h2>Nochmals eine Ableitung</h2>
<p>Bereits beim Aufruf eines Webservice mittels PEAR Paketen, musste mit einem &#8220;Murks&#8221; die URL des Webservices manipuliert werden, da SAP den (notwendigen) Mandanten nicht automatisch an der Webservice-URL anfügt. Daran ändert logischerweise auch die Verwendung einer anderen SOAP Bibliothek nichts. Da wir aber im OO-Umfeld sind, lässt sich dies hier ebenfalls elegant..  Hierzu leiten wir von unserer (bereits abgeleiteten) Klasse <em>SoapAuthClient</em> ab und überschreiben nun die Methode <em>__do_request()</em>. An dieser Stelle lässt sich der Mandant ohne Probleme anfügen.  Im gleichen Schritt führen wir zudem einen Konstruktor ein, der anstelle der URL der WSDL Datei die Serverparameter, die Benutzerdaten und der Name des RFC Bausteins erwartet. Die URL wird dann direkt im Konstruktor zusammengesetzt.  Ausserdem lässt sich hier beim eigentlichen Aufruf gleich die UTF-8 Konvertierung realisieren, sodass am Ende eine simple Klasse zu Verfügung steht, welche ohne viel Aufwand verwendet werden kann.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
</pre></td><td class="code"><pre class="php"><span class="kw2">class</span> SAPSoapClient <span class="kw2">extends</span> SoapAuthClient <span class="br0">&#123;</span>
	<span class="kw2">private</span> <span class="re0">$wdsl</span><span class="sy0">;</span>
	<span class="kw2">private</span> <span class="re0">$user</span><span class="sy0">;</span>
	<span class="kw2">private</span> <span class="re0">$pass</span><span class="sy0">;</span> 
	<span class="kw2">private</span> <span class="re0">$client</span><span class="sy0">;</span>
	<span class="kw2">private</span> <span class="re0">$func</span><span class="sy0">;</span>
&nbsp;
	<span class="kw2">function</span> SAPSoapClient<span class="br0">&#40;</span><span class="re0">$host</span><span class="sy0">,</span> <span class="re0">$port</span><span class="sy0">,</span> <span class="re0">$usessl</span><span class="sy0">,</span> <span class="re0">$user</span><span class="sy0">,</span> <span class="re0">$pass</span><span class="sy0">,</span> <span class="re0">$client</span><span class="sy0">,</span> <span class="re0">$func</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
		<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">wdsl</span> <span class="sy0">=</span> <span class="br0">&#40;</span><span class="re0">$usessl</span> ? <span class="st_h">'https'</span> <span class="sy0">:</span> <span class="st_h">'http'</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="st_h">'://'</span><span class="sy0">.</span><span class="re0">$host</span><span class="sy0">.</span><span class="br0">&#40;</span><span class="sy0">!</span><a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">&#40;</span><span class="re0">$port</span><span class="br0">&#41;</span> ? <span class="st_h">':'</span><span class="sy0">.</span><span class="re0">$port</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="st_h">'/sap/bc/soap/wsdl/?services='</span><span class="sy0">.</span><span class="re0">$func</span><span class="sy0">.</span><span class="st_h">'&amp;sap-client='</span><span class="sy0">.</span><span class="re0">$client</span><span class="sy0">;</span>
		<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">user</span> <span class="sy0">=</span> <span class="re0">$user</span><span class="sy0">;</span>
		<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">pass</span> <span class="sy0">=</span> <span class="re0">$pass</span><span class="sy0">;</span>
		<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">client</span> <span class="sy0">=</span> <span class="re0">$client</span><span class="sy0">;</span>
		<span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">func</span> <span class="sy0">=</span> <span class="re0">$func</span><span class="sy0">;</span>
&nbsp;
		parent<span class="sy0">::</span>__construct<span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">wdsl</span><span class="sy0">,</span>
			<a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st_h">'login'</span><span class="sy0">=&gt;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">user</span><span class="sy0">,</span> <span class="st_h">'password'</span><span class="sy0">=&gt;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">pass</span><span class="br0">&#41;</span>
		<span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="co4">/**
	 * Override because we need the Client in the URL!
	 */</span>
	<span class="kw2">function</span> __doRequest<span class="br0">&#40;</span><span class="re0">$request</span><span class="sy0">,</span> <span class="re0">$location</span><span class="sy0">,</span> <span class="re0">$action</span><span class="sy0">,</span> <span class="re0">$version</span><span class="sy0">,</span> <span class="re0">$one_way</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="re0">$location</span> <span class="sy0">.=</span> <span class="st_h">'?sap-client='</span><span class="sy0">.</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">client</span><span class="sy0">;</span>	
		<span class="kw1">return</span> parent<span class="sy0">::</span>__doRequest<span class="br0">&#40;</span><span class="re0">$request</span><span class="sy0">,</span> <span class="re0">$location</span><span class="sy0">,</span> <span class="re0">$action</span><span class="sy0">,</span> <span class="re0">$version</span><span class="sy0">,</span> <span class="re0">$one_way</span> <span class="sy0">=</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<span class="co4">/**
	 * Call method
	 */</span>
	<span class="kw2">function</span> call<span class="br0">&#40;</span><span class="re0">$args</span> <span class="sy0">=</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$args</span> <span class="kw1">as</span> <span class="re0">$k</span> <span class="sy0">=&gt;</span> <span class="re0">$v</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
			<span class="re0">$args</span><span class="br0">&#91;</span><a href="http://www.php.net/utf8_encode"><span class="kw3">utf8_encode</span></a><span class="br0">&#40;</span><span class="re0">$k</span><span class="br0">&#41;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <a href="http://www.php.net/utf8_encode"><span class="kw3">utf8_encode</span></a><span class="br0">&#40;</span><span class="re0">$v</span><span class="br0">&#41;</span><span class="sy0">;</span>
		<span class="br0">&#125;</span>
&nbsp;
		<span class="kw1">return</span> <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="br0">&#123;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">func</span><span class="br0">&#125;</span><span class="br0">&#40;</span><span class="re0">$args</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></td></tr></table></div>

<h2>Ab die Post</h2>
<p>Der Aufruf ist nun denkbar einfach und auch selbsterklärend. Nach der Erzeugung des entsprechenden Objekts kann nun die Anfrage direkt losgeschickt werden. Man muss sich weder um Zeichenkodierung noch um Authentifizierung oder kryptische URLs kümmen. Ausserdem ist auch die Fehlerbehandlung dank Exceptions völlig problemlos. Im Gegensatz zur Lösung mit dem PEAR Paket kommt das Ergebnis nicht als Array, sondern als Objekt zurück, sodass sich auch hier die Resultate einfach adressieren lassen.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
</pre></td><td class="code"><pre class="php">try <span class="br0">&#123;</span>
	<span class="re0">$soap</span> <span class="sy0">=</span> <span class="kw2">new</span> SAPSoapClient<span class="br0">&#40;</span>
		<span class="st_h">'host'</span><span class="sy0">,</span>	                <span class="co1">// Host</span>
		<span class="st_h">'8000'</span><span class="sy0">,</span>                 <span class="co1">// Port</span>
		<span class="kw4">false</span><span class="sy0">,</span>                  <span class="co1">// SSL?</span>
		<span class="st_h">'Benutzer'</span><span class="sy0">,</span>             <span class="co1">// User</span>
		<span class="st_h">'Passwort'</span><span class="sy0">,</span>             <span class="co1">// Password</span>
		<span class="st_h">'299'</span><span class="sy0">,</span>                  <span class="co1">// Client</span>
		<span class="st_h">'Z_WEBSERVICE_GET_ORIGINAL'</span> <span class="co1">// SAP Funktionsbaustein</span>
	<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	<span class="co1">// Setup Parameters</span>
	<span class="re0">$params</span> <span class="sy0">=</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
		<span class="st_h">'I_DOKAR'</span><span class="sy0">=&gt;</span><span class="st_h">'ZZZ'</span><span class="sy0">,</span>
		<span class="st_h">'I_DOKNR'</span><span class="sy0">=&gt;</span><span class="st_h">'10000001398'</span><span class="sy0">,</span>
		<span class="st_h">'I_DOKTL'</span><span class="sy0">=&gt;</span><span class="st_h">'000'</span><span class="sy0">,</span>
		<span class="st_h">'I_DOKVR'</span><span class="sy0">=&gt;</span><span class="st_h">'001'</span><span class="sy0">,</span>
		<span class="st_h">'I_APPNR'</span><span class="sy0">=&gt;</span><span class="st_h">'1'</span>
	<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	<span class="re0">$res</span> <span class="sy0">=</span> <span class="re0">$soap</span><span class="sy0">-&gt;</span><span class="me1">call</span><span class="br0">&#40;</span><span class="re0">$params</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
	<span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$res</span><span class="sy0">-&gt;</span><span class="me1">E_RC</span> <span class="sy0">!=</span> <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<a href="http://www.php.net/die"><span class="kw3">die</span></a><span class="br0">&#40;</span><span class="re0">$res</span><span class="sy0">-&gt;</span><span class="me1">E_MESSAGE</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
&nbsp;
	<a href="http://www.php.net/header"><span class="kw3">header</span></a><span class="br0">&#40;</span><span class="st_h">'Content-type: application/pdf'</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<a href="http://www.php.net/header"><span class="kw3">header</span></a><span class="br0">&#40;</span><span class="st_h">'Content-Disposition: inline; filename=&quot;test.pdf&quot;'</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="kw1">echo</span> <span class="re0">$res</span><span class="sy0">-&gt;</span><span class="me1">E_DATA</span><span class="sy0">;</span>
<span class="br0">&#125;</span> catch <span class="br0">&#40;</span>SoapFault <span class="re0">$e</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
	<span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span><span class="re0">$e</span><span class="sy0">-&gt;</span><span class="me1">detail</span><span class="sy0">-&gt;</span><span class="me1">Error</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span class="kw1">echo</span> <span class="re0">$e</span><span class="sy0">-&gt;</span><span class="me1">detail</span><span class="sy0">-&gt;</span><span class="me1">Error</span><span class="sy0">-&gt;</span><span class="me1">type</span><span class="sy0">.</span><span class="st_h">' '</span><span class="sy0">.</span><span class="re0">$e</span><span class="sy0">-&gt;</span><span class="me1">detail</span><span class="sy0">-&gt;</span><span class="me1">Error</span><span class="sy0">-&gt;</span><span class="me1">message</span><span class="sy0">;</span>
	<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span>
		<span class="kw1">echo</span> <span class="re0">$e</span><span class="sy0">-&gt;</span><span class="me1">getMessage</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
	<span class="br0">&#125;</span>
<span class="br0">&#125;</span> catch <span class="br0">&#40;</span>Exception <span class="re0">$e</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
	<span class="kw1">echo</span> <span class="re0">$e</span><span class="sy0">-&gt;</span><span class="me1">getMessage</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></td></tr></table></div>

<h2>Fazit</h2>
<p>Mit den integrierten SOAP Klassen geht es nochmals einfacher. Zwar ist auch hier ein kleiner Umweg notwendig, dieser ist jedoch viel sauberer als bei der PEAR Variante, da hier ganz gezielt Methoden überschrieben werden können. Ausserdem lässt sich die so erstellte Klasse immer wieder verwenden.  Meines Wissen unterstützten die SOAP Klassen ein Caching der WSDL Dateien. Dieses geht durch unseren Umweg natürlich vollständig verloren. Man könnte sich also überlegen, die Kopie der WSDL Datei ebenfalls zu cachen und nicht jedes Mal mittels cURL nachzulesen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.faebusoft.ch/sap/schnittstellen-programmierung/rfc-bausteine-%c3%bcber-webservice-mit-php-aufrufen-variante-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

