Ich möchte mit der LSMW neu debitoren importieren.
Soweit funktioniert es ja auch.
Die Tabelle KNA1 enthält ein Feld NAME1 (kein Schlüssel)).
Mein Importfile 'Bewerber' enthält ebenfalls diese Spalte.
Wenn es den Namen (aus Bewerber) in der KNA1-NAME1 schon gibt, dann soll kein Datensatz angelegt werden.
Sprich: Keine doppelten Debitoren (nach Name gesehen).
Habe folgendes ausprobiert:
__GLOBAL_DATA__: TABLES: KNA1.
BKN00-TCODE: Select count(*) from kna1
where name1 = BEWERBER-NAME1.
if sy-dbcnt = 0.
skip_record.
else.
bkn00-tcode = 'XD01'.
endif.
Das funktioniert aber nicht wirklich.
Die Datensätze werden jedesmal erstellt.
Nach Select count(*) ist sy-dbcnt = 1, weil immer ein Eintrag zurückgeliefert wird (nämlich die Anzahl passender Sätze).
Du musst also die Anzahl mit INTO my_cnt selektieren und dann my_cnt prüfen.
Bei SELECT COUNT(*) müssen außerdem alle Einträge geprüft werden, obwohl Du nur wissen willst, ob es überhaupt (mindestens) einen Eintrag gibt.
Außerdem liegt auf NAME1 kein Sekundärindex.
Daher ist es besser, zusätzlich zu NAME1 noch MCOD1 als Bedingung aufzunehmen und SELECT SINGLE zu nehmen (dann aber außer SY-SUBRC 0 auch 8 möglich, wenn es mehrere passende gibt).
Nebenbei: Was machst Du, wenn 2 Debitoren 'Klaus Müller' heißen? Den 2. nicht anlegen?
Das kann es doch auch nicht sein.
if sy-dbcnt = 0.
skip_record.
else.
bkn00-tcode = 'XD01'.
endif.
Du machst den skip falls ( sy-dbcnt = 0 ) = ( Kein Datensatz gefunden. Das widerspricht deiner Problembeschreibung. Allerdings halte ich diesen Select eh für problematisch - siehe 2.)
2.) Ich würd mir alle NAME1-Werte aus der KNA1 beim Start der LSMW-Konvertierung in eine int. Tabelle holen, alle in Großschreibung konvertieren und evtl. noch Leerzeichen rauswerfen. Selbige Aktion mit dem "NAME1" aus dem Bewerberfile und dann erst vergleichen. Damit kannst du zumindest simple Formatierungsfehler ausgleichen.
3.) g_skip_record ist für deinen Fall nicht so toll - es sei denn du möchtest dies für alle Segmente die du anlegen willst tun. ( mind. BKN00 und BKNA1). Ich benutze stattdessen lieber g_skip_transaction.
zu 1) hast recht - mein Fehler
zu 2) wie und wo
zu 3) entweder alles oder nix
habe jetzt 2mal (bei BKN00 und BKNA1) bei
__END_OF_RECORD__ folgendes eingetragen:
Select count(*) from kna1 where name1 = bewerber-name1.
if sy-dbcnt <> 0.
skip_record.
else.
transfer_record.
endif.
könnte mir vorstellen, daß mit
'g_skip_transaction' der Code nur einmal
benötigt wird. Nur wo trage ich das ein.
habe jetzt ungefähr nen 1/2 Tag gebraucht,
um rauszufinden, wo ich jetzt meinen Code habe.
bei "BEGIN_OF_PROCESSING" die KNA1 lesen (mittels Select) und dann stets bei "BEGIN_OF_RECORD" oder "END_OF_RECORD" mittels READ TABLE schauen, ob der Debitor schon ex. und in diesem Fall dann dort auch g_skip_transaction.
Hmm - und wenn du den Quälcode des von der LSMW-erzeugten Reports sehen willst brauchst du doch nur den ( mit der Defaulteinstellung auf unsichtbar gesetzten ) Punkt "Umsetzungsprogramm anzeigen" anklicken.