<?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>Fri, 17 Feb 2012 09:19:58 +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>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>
		<item>
		<title>WP Calendar 1.4.0 freigegeben</title>
		<link>http://www.faebusoft.ch/webentwicklung/wp-calendar-1-4-0-freigegeben/</link>
		<comments>http://www.faebusoft.ch/webentwicklung/wp-calendar-1-4-0-freigegeben/#comments</comments>
		<pubDate>Thu, 03 Mar 2011 17:06:19 +0000</pubDate>
		<dc:creator>faebu</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[Wordpress Plugins]]></category>

		<guid isPermaLink="false">http://www.faebusoft.ch/?p=163</guid>
		<description><![CDATA[Die neuste WP Calendar Version wurde freigegeben. Die Version 1.4 beinhaltet ein umfangreiches Feature bezüglich der Behandlung von Kommentaren. Ausserdem wurden verschiedene Anpassung in Bezug auf WP 3.1 gemacht. Kommentare für WP Calendar Werden auf einer Seite die Details zu einem Event angezeigt &#8211; normalerweise also auf der Seite für die Einzelanzeige &#8211; werden neu [...]]]></description>
			<content:encoded><![CDATA[<p>Die neuste WP Calendar Version wurde freigegeben. Die Version 1.4 beinhaltet ein umfangreiches Feature bezüglich der Behandlung von Kommentaren. Ausserdem wurden verschiedene Anpassung in Bezug auf WP 3.1 gemacht.<span id="more-163"></span></p>
<h2>Kommentare für WP Calendar</h2>
<p>Werden auf einer Seite die Details zu einem Event angezeigt &#8211; normalerweise also auf der <em>Seite für die Einzelanzeige</em> &#8211; werden neu sämtliche Kommentare mit dem Event verknüpft. In der Einzelanzeige des Events erscheinen deshalb nur noch die Kommentare, die auch zu diesem Event abgegeben wurden. Ausserdem wurde in diesem Zusammenhang ein Fehler behoben, der dazu führte, dass nach der Abgabe eines Kommentars die Event-Id verloren ging und in der Einzelanzeige keine Daten mehr angezeigt wurden.</p>
<p>Auch im Admin-Interface wird nun in der Kommentarübersicht nicht mehr der Titel der Seite (oftmals Event not found) sondern der effektive Titel des Events angezeigt. Die Anzahl Kommentare sind zudem in der Event-Übersicht ersichtlich.</p>
<h3>Voraussetzungen</h3>
<p>Wird in deinem Template das Eingabeformular für Kommenare mit der Funktion <code>comment_form()</code> erzeugt, sind keine weitere Vorkehrungen notwendig. Wird das Kommentarformular jedoch in deinem Template (normalerweise in der Datei comments.php) direkt erzeugt, muss dieses Template erweitert werden. Hierzu muss zwischen des öffnenden und schliessenden Form-Tags folgende PHP Funktion eingefügt werden:</p>

<div class="wp_syntax"><div class="code"><pre class="php"><span class="kw2">&lt;?php</span> the_comment_event_meta<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="sy1">?&gt;</span></pre></div></div>

<h2>Neuer Parameter <em>linktopost</em></h2>
<p>Für die Tags <code>{ event_url}</code> und <code>{ events_calendar}</code> steht ein neuer Parameter <em>linktopost </em>zu Verfügung. Wir dieser auf 1 (true) geschaltet, wird nicht die Seite für die Einzalanzeige sondern der Permalink des Artikels verwendet, sofern der Event mit einem Artikel verknüpft ist.</p>
<h2>Anpassung des Editors für WP 3.1</h2>
<p>Mit der neuen WP Version 3.1 hat sich einmal mehr der Editor ein wenig verändert &#8211; man sieht dies an den neuen Dialogen (z.B. beim Einfügen eines neuen Links). Diese neuen Dialogen funktionierten mit der aktuellen WP Calendar Version nicht. Ausserdem gab es einen Konflikt zwischen den Stylesheets, sodass die Dialoge fehlerhaft dargestellt wurden.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.faebusoft.ch/webentwicklung/wp-calendar-1-4-0-freigegeben/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WP Calendar 1.3.0 freigegeben</title>
		<link>http://www.faebusoft.ch/webentwicklung/wp-calendar-1-3-0-freigegeben/</link>
		<comments>http://www.faebusoft.ch/webentwicklung/wp-calendar-1-3-0-freigegeben/#comments</comments>
		<pubDate>Sat, 26 Feb 2011 01:11:26 +0000</pubDate>
		<dc:creator>faebu</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[Wordpress Plugins]]></category>

		<guid isPermaLink="false">http://www.faebusoft.ch/?p=159</guid>
		<description><![CDATA[WP Calendar 1.3.0 wurde nach langer, langer Zeit freigegeben. Nebst einigen Bugfixes enthält die neuste Version auch ein neues Feature zum Erzeugen von Kalendereinträgen direkt aus einem Artikel heraus. Für die Erzeugung eines Kalendareintrag aus einem Artikel heraus wurde der Admin-Oberfläche der Artikelbearbeitung ein neues Widget spendiert, in dem die Erzeugung eines Kalendereintrages aktiviert werden [...]]]></description>
			<content:encoded><![CDATA[<p>WP Calendar 1.3.0 wurde nach langer, langer Zeit freigegeben. Nebst einigen Bugfixes enthält die neuste Version auch ein neues Feature zum Erzeugen von Kalendereinträgen direkt aus einem Artikel heraus.<span id="more-159"></span></p>
<p>Für die Erzeugung eines Kalendareintrag aus einem Artikel heraus wurde der Admin-Oberfläche der Artikelbearbeitung ein neues Widget spendiert, in dem die Erzeugung eines Kalendereintrages aktiviert werden kann. Zudem werden in diesem Widget auch die benötigten Daten, wie Start und Ende oder der Ort erfasst. Der Titel, der Inhalt und die Kategorien werden vollständig aus dem Artikel übernommen.</p>
<p>Zudem wird definiert, ob der Event mit dem Artikel synchronisert werden soll. Ist dies der Fall, werden die Daten des Artikels bei jeder Aktualisierung jeweils in den Event übertragen, während beim Bearbeiten des Kalendereintrags die Felder für Titel, Inhalt und Kategorien gesperrt werden. Die Synchronisation kann jederzeit aktiviert bzw. deaktiviert werden. Bei einer Reaktivierung werden jedoch die Daten des Kalendereintrags (logischwerweise) durch die Daten vom Artikel überschrieben. Auf diese Weise ist es also auch möglich einen Kalendereintrag initial zu erzeugen, nachher aber individuell und unabhängig vom Aritkel zu pflegen.</p>
<p>In beiden Editiermasken (Artikel und Kalendereintrag) wird eine allfällige Synchronisation unmissverständlich angezeigt. In der Kalenderübersicht wird die Synchronisation ebenfalls mit einem Schlösschen signalisiert.</p>
<p><img class="alignnone size-full wp-image-160" title="changelog-1" src="http://www.faebusoft.ch/wp-content/uploads/2011/02/changelog-12.jpg" alt="" width="600" height="52" /></p>
<p>An dieser Stelle sei noch explizit darauf hingewiesen, dass der Status <strong>nicht</strong> synchronisiert wird. Eine Veröffentlichung des Artikels führt also nicht automatisch zu einer Veröffentlichung des Kalendereintrags.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.faebusoft.ch/webentwicklung/wp-calendar-1-3-0-freigegeben/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>SAP Gui Sicherheitseinstellungen</title>
		<link>http://www.faebusoft.ch/sap/sap-gui-sicherheitseinstellungen/</link>
		<comments>http://www.faebusoft.ch/sap/sap-gui-sicherheitseinstellungen/#comments</comments>
		<pubDate>Tue, 22 Feb 2011 13:14:27 +0000</pubDate>
		<dc:creator>faebu</dc:creator>
				<category><![CDATA[SAP]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[Ablehnen]]></category>
		<category><![CDATA[Administrator]]></category>
		<category><![CDATA[Ausnahmen]]></category>
		<category><![CDATA[Kontext]]></category>
		<category><![CDATA[Optionen]]></category>
		<category><![CDATA[Regeln]]></category>
		<category><![CDATA[Rules]]></category>
		<category><![CDATA[SAP Gui]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Sicherheitseinstellungen]]></category>
		<category><![CDATA[Zulassen]]></category>

		<guid isPermaLink="false">http://www.faebusoft.ch/?p=152</guid>
		<description><![CDATA[Der &#8220;neue&#8221; SAP Gui 7.20 bringt ein völlig neues Sicherheitskonzept mit. Installiert man den SAP Gui 7.20 zum ersten Mal wird man bei Transaktionen mit Datei- und/oder Verzeichnishandling mit Warnpopups überhäuft &#8211; der Benutzer wird stark überfordert. Um dem entgegen zu wirken, muss der SAP Gui korrekt konfiguriert werden, was Aufgabe der Admins ist. Die [...]]]></description>
			<content:encoded><![CDATA[<p>Der &#8220;neue&#8221; SAP Gui 7.20 bringt ein völlig neues Sicherheitskonzept mit. Installiert man den SAP Gui 7.20 zum ersten Mal wird man bei Transaktionen mit Datei- und/oder Verzeichnishandling mit Warnpopups überhäuft &#8211; der Benutzer wird stark überfordert. Um dem entgegen zu wirken, muss der SAP Gui korrekt konfiguriert werden, was Aufgabe der Admins ist.</p>
<p><span id="more-152"></span>Die SAP Gui Sicherheitseinstellung stehen noch in den Kinderschuhen, mit jedem Patch Level (mittlerweile PL4) wurden neue Funktionalitäten hinzugefügt. Es kann also durchaus sein, dass mit PL5 bereits wieder neue Funktionen und Hilfsmittel zu Verfügung stehen, welche zum jetzigen Zeitpunkt noch nicht bekannt sind.</p>
<h2>Sicherheitseinstellungen</h2>
<p>Für die Pflege der Sicherheitseinstellungen müssen die SAP Gui Optionen geöffnet werden. Diese findet man entweder in der Systemsteuerung oder können über das SAP Logon mit dem Menü oben links erreicht werden.</p>
<p><img class="alignnone size-full wp-image-153" title="Sicherheitseinstellungen" src="http://www.faebusoft.ch/wp-content/uploads/2011/02/Sicherheitseinstellungen.jpg" alt="" width="600" height="448" /></p>
<h3>Status der Sicherheitseinstellungen</h3>
<p>In den globalen Einstellungen kann der <em>Status </em>der Sicherheitseinstellungen gepflegt werden. SAP kennt hier drei verschiedene Modi: <em>Deaktiviert</em>, <em>Regelbasiert </em>(Standard) und <em>Strikt ablehnen</em>. Hier könnten also die Sicherheitsprüfungen lokale deaktiviert werden, womit man sämtliche Popups los wäre, gleichzeitig aber Sicherheitslöcher aufreissen würde. Von dieser Einstellung ist strikt abzuraten!</p>
<p>Mit dem Betriebsmodus <em>Strikt ablehnen</em> werden sämtliche lokale Aktionen verweigert, ausser was in den Regeln von SAP explizit gewährt wird. Einen Anwendungszweck für diese Einstellungen sehe ich persönlich nicht.</p>
<p>Die regelbasierten Sicherheitseinstellungen sind standardmässig aktiviert. Von diesem Modus würde ich nicht abweichen, denn SAP liefert im Standard dutzende Regeln aus, die sicherheitskritische Aktionen bereits deaktivieren (z.B. das Überschreiben von Sicherheitseinstellung durch ein Programm). Diese Regeln stehen alle ganz oben in der Regelliste, haben somit höchste Priorität und können auch durch einen lokale oder einen <em>Administrator</em>-Regel nicht umgangen werden, was auch gut so ist.</p>
<h3>Die Standardaktion</h3>
<p>Mit der Standardaktion wird bestimmt, was zu tun ist, wenn keine Regel gefunden wird. Auch hier gibt es drei mögliche Varianten: <em>Zulassen</em>, <em>Fragen </em>(Standard) und <em>Ablehnen</em>. Damit gibt es nun eine weitere Option zum Deaktivieren der Popups, indem man hier die Standardaktion auf Zulassen stellt. Damit öffnet man zwar ebenfalls mögliche Sicherheitslöcher, es werden aber in jedem Fall die von SAP vorgegebenen Regeln vollständig interpretiert und somit kritische Aktionen verweigert.</p>
<p>Der Standardwert bleibt hier wohl die beste Einstellung. Hat man jedoch die Regeln vollständig ausgeprägt und man erachtet dieses Regelset als abschliessend, könnte man hier als Standardaktion gar <em>Ablehnen </em>in Betracht ziehen, mit dem Risiko, dass gewisse Funktionen im SAP nicht mehr korrekt funktionieren könnten und die Fehlersuche zusätzlich erschwert wird.</p>
<h3>Regeln</h3>
<p>Hinter den Regeln steckt ein mächtiges Definitionswerkzeug. Alle Regeln werden in der Reihenfolge abgearbeitet, in der sie in der Liste stehen. Dies ist wichtig, wenn man Ausnahmen für umfassende Regeln erstellen möchte. Die Ausnahme muss in der Liste weiter oben platziert werden, damit diese Ausnahme von der umfassenden Regel berücksichtigt wird.</p>
<p>Ausserdem haben sämtliche Regeln eine Herkunft: <em>SAP</em>, <em>Administrator</em> oder <em>Benutzer</em>. Sowohl die Regeln von <em>SAP </em>als auch die vom <em>Administrator </em>können lokal <em>nicht</em> <em>verändert </em>werden. Diese Sperre beinhaltet auch die Priorität, es ist also nicht möglich eine selber definierte Regel vor eine <em>SAP</em>- oder <em>Administrator</em>-Regel zu schieben. Jeden auf dem Client definierte Regel ist immer eine <em>Benutzer</em>-Regel.</p>
<p>Regeln können für unterschiedlichste Objekte definiert werden. Mit PL4  kennt das SAP Gui rund neun Regelobjekte, darunter Objekte wie <em>Datei</em>, <em>Verzeichnis</em>, <em>Registry</em>, usw. Jede Regel erwartet ein Objekt, wobei hier ein Asteriks (*) verwendet werden kann, womit die Objekte über Muster ermittelt werden können. Man kann also z.B. eine Regel für sämtliche Textdateien erstellen, indem man als Objekt <em>*.txt</em> verwendet. Man könnte sogar nur eine Asteriks eingeben, damit die Regel für sämtliche Objekte aktiv wird.</p>
<p><img class="alignnone size-full wp-image-154" title="Regeln" src="http://www.faebusoft.ch/wp-content/uploads/2011/02/Regeln.jpg" alt="" width="600" height="451" /></p>
<p>Pro Regel wird dann über die <em>Aktion</em> definiert, ob man einen bestimmten Zugriff entweder <em>zulassen</em> oder <em>ablehnen </em>möchte. Weiter steht die Option <em>Kontextabhängig </em>zu Verfügung, mit der man die Regel noch spezifischer ausprägen kann. Für die Aktionen <em>Zulassen </em>und <em>Ablehnen </em>muss ausserdem die zu erlaubende bzw. abzulehnende <em>Zugriffsart </em>definiert werden. Die <em>Zugriffsart </em>ist abhängig vom jeweiligen Regelobjekt, ist aber selbsterkärend.</p>
<h3>Kontextabhängige Regeln</h3>
<p>Hat man für eine Regel die Aktion <em>Kontextabhängig </em>gewählt, kann man im unteren Bereich nun Regeln pro System, Netzwerk, Mandant, Transaktion, Dynproprogramm und -nummer festlegen. Auch hier kann wieder ein Asteriks als Platzhalter verwendet werden, was beim Erstellen einer neuen Kontextregel auch standardmässig für alle Felder &#8211; mit Ausnahme des Netzwerks &#8211; vorgeschlagen wird. Für das Netzwerk gelten spezielle Regelkonventionen, welche hier nicht weiter beschrieben werden. Mehr Informationen hierzu gibt es am Ende des Artikels.</p>
<p>Für jede Kontextregel wird ebenfalls die <em>Aktion </em>und die <em>Zugriffart </em>festgelegt. Ausserdem muss jede Kontextregel aktiviert werden. Der Status ist hier standardmässig auf <em>deaktiviert </em>eingestellt! Die verschiedenen Kontextregeln werden ebenfalls gemäss der Reihenfolge in der Liste abgearbeitet, allfällige Reihenfolgen sind also ebenfall zu berücksichtigen.</p>
<h3>Fehler im Feld Transaktion</h3>
<p>Wie sich aus meinen Test herausgestellt hat, kann das Feld Transaktion mit PL4 nicht korrekt verwendet werden. Beim Start einer Transaktion wird nämlich noch der alte Transaktionscode verwendet. Startet man also z.B. eine Transaktion direkt aus dem Einstiegsbild werden die Regeln mit dem Transaktionscode SESSION_MANAGER geprüft, anstelle des eigentlichen Transaktionscodes. Ich habe für diesen Fehler bei SAP ein Ticket eröffnet.</p>
<h2>Administration</h2>
<p>Um dem Benutzer die Entscheidungen bzgl. Regeln abzunehmen, sollte man alle Regeln global definieren und die globalen Einstellungen zudem für den Benutzer sperren. Basis für diese Sicherheitseinstellungen ist die Registry. Hier werden die notwendigen Daten im Schlüssel</p>
<blockquote><p>HKLM\Software\SAP\SAPGUI Front\SAP Frontend Server\Security</p></blockquote>
<p>bzw. für 64-bit Rechner im Schlüssel</p>
<blockquote><p>HKLM\SOFTWARE\Wow6432Node\SAP\SAPGUI Front\SAP Frontend Server\Security</p></blockquote>
<p>abgelegt.</p>
<h3>Einstellungen sperren</h3>
<p>Damit der Benutzer die Sicherheitseinstellungen nicht deaktivieren und die Standardaktion nicht ändern kann, sollten diese Werte über die Registry vorbelegt werden. Hierzu legt man für ersteres einen DWORT-Wert mit dem Namen <em>SecurityLevel </em>an. Als Wert erfasst man 0 für die <em>Deaktiviert</em>, 1 für <em>Regelbasiert </em>und 2 für <em>Strikt ablehnen</em>. Für die Standardaktion wird ebenfalls ein DWORT-Wert mit dem Namen <em>DefaultAction </em>erfasst. Die gültigen Werte sind 0 für <em>Erlauben</em>, 1 für <em>Fragen </em>und 2 für <em>Ablehnen</em>.</p>
<h3>Globale Regeln</h3>
<p>Bei den globalen Regeln handelt es sich um <em>Administrator</em>-Regeln. Um <em>Administrator</em>-Regel zu erzeugen, definiert man die Regeln wie gewohnt in den Optionen (als <em>Benutzer</em>-Regeln). Diese <em>Benutzer</em>-Regeln werden alle in einer Datei mit dem Namen <em>saprules.xml</em> gespeichert. Die Datei wird im Application-Data Verzeichnis des Benutzers abgelegt, unter Windows 7 also z.B. unter</p>
<blockquote><p>C:\Users\%USER%\AppData\Roaming\SAP\Common</p></blockquote>
<p>Diese erzeugte Regeldatei kann nun zentral auf einem Server abgelegt und mit allen SAP Gui Installation verknüpft werden. Damit werden sämtliche Regeln aus dieser Datei als nicht editierbare <em>Administrator</em>-Regeln übernommen.</p>
<p>Damit der SAP Gui diese Regeldatei interpretiert, muss ebenfalls ein Registry Eintrag erzeugt werden. Hierzu erstellt man einen Eintrag vom Typ <em>Wert der erweiterbaren Zeichenfolge</em> (REG_EXPAND_SZ) und trägt dort als Wert den Pfad zu dieser zentralen XML Datei ein.</p>
<p>Wurden diese Einträge korrekt gepflegt, können diese Parameter nicht durch den Benutzer geändert werden und die definierten Regeln erscheinen als <em>Administrator</em>-Regeln.</p>
<p><img class="alignnone size-full wp-image-155" title="SicherheitseinstellungenAdmin" src="http://www.faebusoft.ch/wp-content/uploads/2011/02/SicherheitseinstellungenAdmin.jpg" alt="" width="600" height="448" /></p>
<h2>Fazit</h2>
<p>Wer den neuen SAP Gui verwendet, sollte sich unbedingt Zeit für die Sicherheitseinstellungen nehmen und diese vor dem Rollout intensiv testen. Transaktionen mit Zugriff auf lokale Resourcenn lassen sich normalerweise schnell und eindeutig ermitteln und folglich auch Problemlos im Regelwerk konfigurieren.</p>
<h2>Weiterführende Info</h2>
<p>Im offiziellen <a href="http://www.sdn.sap.com/irj/sdn/sap-gui?rid=/library/uuid/002444be-7018-2d10-e18e-a8c537198ef6">Security Guide für SAP GUI for Windows</a> (englisch) findet man noch detailliertere Informationen zum Sicherheitskonzept des SAP Gui 7.20.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.faebusoft.ch/sap/sap-gui-sicherheitseinstellungen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

