Seite 1 von 4

suchen und anhängen

Verfasst: Do, 29. Okt 2020 20:01
von Manfred
ich muß eine Tabelle durchlaufen und dann prüfen, ob es den Datensatz schon in einer anderen Tabelle gibt. Wenn es den Satz nicht gibt, dann soll ein neuer dort angehängt werden.
Die Sourcetabelle wird mit DBSKIP() durchlaufen, die Zieltabelle soll mit SQL durchsucht und im Zweifelsfalle mit SQL ergänzt werden.
Wie löst man Suchen und anhängen elegant mit SQL?

Code: Alles auswählen

SELECT * from tabelle where feld=dings
wenn das Ergebnis leer ist
INSERT INTO tabelle (feld1) VALUES("bla")
oder geht das eleganter?

Re: suchen und anhängen

Verfasst: Do, 29. Okt 2020 20:35
von georg
Hallo, Manfred -


für jeden Satz aus Tabelle A, der keine Entsprechung in Tabelle B hat, muss ein Satz angelegt werden - so habe ich das verstanden.

Also,

Code: Alles auswählen

SELECT feld1, feld2, feld3 FROM TabA WHERE feld1 NOT IN (SELECT feld1 FROM TabB)
Ich habe jetzt mal unterstellt, dass über Feld1 verknüpft werden kann. Du erhältst eine Auswahl von Sätzen der Tabelle A, die keine Entsprechung in Tabelle B haben. Jetzt einmal durchackern und die neuen Sätze einfügen.

Re: suchen und anhängen

Verfasst: Fr, 30. Okt 2020 7:07
von Manfred
Hi Georg,
ich durchlaufe Tabelle A mit Xbase und will Tabelle b mit SQL verarbeiten. Dein Vorschlag sieht mir nach reinem SQL aus für beide Tabellen.

Re: suchen und anhängen

Verfasst: Fr, 30. Okt 2020 7:55
von UliTs
Manfred hat geschrieben: Fr, 30. Okt 2020 7:07...Dein Vorschlag sieht mir nach reinem SQL aus für beide Tabellen.
Was spricht dagegen?

Re: suchen und anhängen

Verfasst: Fr, 30. Okt 2020 7:59
von Manfred
tja Uli, jetzt überlege mal. Wenn eine Tabelle nicht mit SQL angesprochen werden kann, dann ist SQL die schlechte Wahl, oder wie siehst Du das? Deshalb habe ich es ja explizit 2x hervorgehoben, das es NICHT mit SQl komplett gemacht wird.

Re: suchen und anhängen

Verfasst: Fr, 30. Okt 2020 8:24
von Marcus Herz
Es gibt den MERGE Befehl
Mit Xbase durch tabelle A skippen, mit SQL in Tabelle B schrieben:

Code: Alles auswählen

merge tabelleb
on keyfield = :KEY [ and keyfield2 = :KEY2...]
when not matched then insert (fliedlist) values(-valuelist);
Du kannst den String ja einmalig mit strtran oder änhliches aufbauen, musst nur jedesmal die :KEY Werte neu setzen, Erspart die Extra-Suche, ob es den Satz schon gibt.

Re: suchen und anhängen

Verfasst: Fr, 30. Okt 2020 8:51
von Manfred
HI marcus,
Danke für den Hinweis. Allerdings kommt doch noch eine weitere Aufgabe hinzu. Die Ursprungstabelle wird sequentiell geführt, also immer hinten dran. Ich durchlaufe die also immer vom Ende her zum Anfang durch. Wenn ich auf einen Satz stoße, der schon vorhanden ist, dann ist die Arbeit beendet und es muß abgebrochen werden. Wie finde ich heraus, wann das der Fall ist? geht das dann auch noch so?

Re: suchen und anhängen

Verfasst: Fr, 30. Okt 2020 9:01
von Marcus Herz
Du kannst diese Zeile nach dem Merge noch ausführen. Gibt 1 zurück, wenn Satz angehängt wurde, 0 wenn nichts geschah. Das Ergebnis des letzten Statement wird zurückgebeben

Code: Alles auswählen

select ::stmt.UpdateCount from system.iota;

Re: suchen und anhängen

Verfasst: Fr, 30. Okt 2020 9:29
von Manfred
hm,
irgendwas mache ich falsch. Ist das der endgültige Befehl, oder muß da noch was spezifisches rein? Ich bekomme immer eine leere Zeile zurück im ARC, oder muß man den Satz mit SQl einfügen? Ich habe es jetzt über normales Xbase eingefügt. Also generell nur einen Test gemacht um mal zu sehen, wie das klappen könnte mit der Abfrage.

Re: suchen und anhängen

Verfasst: Fr, 30. Okt 2020 9:33
von nightcrawler
Überlass dies dem ADS:

Code: Alles auswählen

merge tabelle2 t2 using tabelle1 t1
on (t2.id=t1.id)
When not matched then insert values(t1.id, t1.text)
damit wird immer alles von Tabelle1 nach Tabelle2 übertragen, was noch nicht drinsteht

Re: suchen und anhängen

Verfasst: Fr, 30. Okt 2020 9:43
von Manfred
OK,
um weitere Missverständnisse auszuräumen, hier nochmal der Ablauf
Es gibt ein Programm, in dem Daten gesammelt und in eine DBF gespeichert werden. (KEIN ADS. Format ist noch DBFNTX)
Diese DBF wird jede Stunde 1zu1 umkopiert in ein Verzeichnis, auf das ich mit meinem Programm zugreifen kann (in dem ADS läuft)
Dann wird diese DBF Tabelle geöffnet von meinem Programm und von hinten nach vorne Schritt für Schritt durchlaufen

Code: Alles auswählen

Do While ! ursprung->(BOF())
     Abfrage über SQL in Zieldatei und evtl. Anhängen, wenn nicht vorhanden. Wenn vorhanden dann Ende
     dbskip(-1)
enddo
Ich hoffe das es jetzt deutlich genug ist, das auf der Ursprungsseite kein ADS vorhanden ist und somit der ADS nicht beides verwalten kann. Oder verstehe ich jetzt wen hier falsch?

Re: suchen und anhängen

Verfasst: Fr, 30. Okt 2020 10:07
von Manfred
Der merge Vorschlag von Marcus sieht ja schon recht gut aus, aber wie ich geantwortet habe, klappt bei mir die Abfrage nicht, ob ein Satz angehängt wurde. Wobei ich dabei nicht verstehe, ob es eine pauschale Prüfung ist, ob generell irgendwo im DD ein Satz angehängt wurde (was dann unbrauchbar wäre) oder ob noch ein zauberwort dazwischen muß um es für die spezielle Tabelle abzufragen.

Re: suchen und anhängen

Verfasst: Fr, 30. Okt 2020 10:10
von nightcrawler
Manfred,
hänge die Quell-Datei mit in deine Datenbank, lass Sie von mir aus auch im compatible mode laufen, damit von außerhalb reingeschrieben werden kann - und dann nimm mein MERGE-Statement. Der ADS sucht Dir alle nicht matchenden Datensätze aus und überträgt sie in die neue Tabelle.

Re: suchen und anhängen

Verfasst: Fr, 30. Okt 2020 10:13
von Manfred
OK,
das liest sich jetzt anders. Aber wie mache ich das? Die wird doch jedesmal neu kopiert und befindet sich vor allen Dingen überhaupt nicht in Reichweite des ADS. Es ist ein koplett anderer Server. Zwar im gleichen Netzwerk, aber eben ein anderer Server. Geht das denn so ohne weiteres, oder muß jedesmal irgendwas beachtet werden? Läuft das dann über die gleiche Connection, wie die anderen DBFS, die eingebunden sind?

Re: suchen und anhängen

Verfasst: Fr, 30. Okt 2020 10:20
von Manfred
nun,
da es wohl doch nicht so einfach ist, hier noch eine Info dazu.
Die besagte DBF wird stündlich umkopiert. Damit es keine Überschneidungen gibt, benenne ich sie vor der Übernahmeprüfung um, damit ich in Ruhe damit arbeiten kann und sollte zwischendurch eine neue kommen, dann wird der Kopierversuch wenigstens nicht behindert, wenn ich gerade mit meinem Programm die DBF auslese. Danach wird die umbenannte DBF gelöscht. Deshalb sehe ich da auch schon Probleme darin, es in den ADS zu integrieren.
Wenn ich das alles vorher gewußt hätte, in welche Richtung das hier geht, hätte ich das natürlich alles direkt zu Anfang erwähnt, aber wer ahnt schon sowas....?

Re: suchen und anhängen

Verfasst: Fr, 30. Okt 2020 10:26
von nightcrawler
dann zuvor ein

Code: Alles auswählen

EXECUTE PROCEDURE sp_AddTableToDatabase(...)
ausführen und die DBF/NTX in die Datenbank integrieren. Danach mit

Code: Alles auswählen

DROP TABLE xyz;
wieder löschen (wird auch phys. gelöscht).

Re: suchen und anhängen

Verfasst: Fr, 30. Okt 2020 10:26
von Manfred
Oh³

Re: suchen und anhängen

Verfasst: Fr, 30. Okt 2020 10:28
von nightcrawler
oh was?

Re: suchen und anhängen

Verfasst: Fr, 30. Okt 2020 10:31
von Manfred
Oh, ich bin begeistert und
oh ich bin überrascht und
oh ich versuche es sofort.

Re: suchen und anhängen

Verfasst: Fr, 30. Okt 2020 11:18
von Manfred
leider klappt das hier nicht

Code: Alles auswählen

EXECUTE PROCEDURE sp_addTableToDatabase('tbuch1_kopie','z:\tauschverzeichnis\fuhrparkverwaltung\webdienst\',1,2)
ERROR IN SCRIPT: poQuery: Error 7200: AQE Error: State = S0000; NativeError = 2129; [SAP][Advantage SQL Engine]Unequal number of insert columns and insert values or the incorrect number of stored procedure input parameters
ich lese jezt nochmal in der Hilfe nach, aber im Moment kann ich damit nichts anfangen, was gemeldet wird

Re: suchen und anhängen

Verfasst: Fr, 30. Okt 2020 11:23
von nightcrawler
klar, da fehlen auch noch Parameter. SQL will alle gefüllt, auslassen gilt nicht!

EXECUTE PROCEDURE sp_AddTableToDatabase(
‘Customer Information’,
‘\\server\share\mydata\customer.dbf’,
1,
2,
‘Lastname.ntx;Cust_id.ntx’,
NULL );

Re: suchen und anhängen

Verfasst: Fr, 30. Okt 2020 11:33
von UliTs
Manfred hat geschrieben: Fr, 30. Okt 2020 7:59 tja Uli, jetzt überlege mal. Wenn eine Tabelle nicht mit SQL angesprochen werden kann, dann ist SQL die schlechte Wahl, oder wie siehst Du das? Deshalb habe ich es ja explizit 2x hervorgehoben, das es NICHT mit SQl komplett gemacht wird.
Sorry, was ist los?
In welchem Faden hast du das denn hervorgehoben? Hier finde ich nichts...
Warum kann denn Deiner Meinung nach die Tabelle nicht mit SQL angesprochen werden?

Re: suchen und anhängen

Verfasst: Fr, 30. Okt 2020 11:39
von Manfred
sind denn gemappte Laufwerke nicht erlaubt?
Und in der Anleitung steht ausdrücklich
TableName,TablePath
wieso muß dann jetzt bei tablePath noch der DBF Name mit angegeben werden?

Code: Alles auswählen

EXECUTE PROCEDURE sp_addTableToDatabase('tbuch1_kopie','z:\tauschverzeichnis\fuhrparkverwaltung\webdienst\tbuch1_kopie',1,2,NULL,NULL)
Eine Indexdatei gibt es nicht, also habe ich das mit Null ausgefült.
das kommt dabei heraus
poQuery: Error 7200: AQE Error: State = HY000; NativeError = 7041; [SAP][Advantage SQL Engine][ASA] Error 7041: File not found. Verify the specified path and file name is correct. z:\tauschverzeichnis\fuhrparkverwaltung\webdienst\tbuch1_kopie.dbf
Und damit keiner auf die idee kommt zu sagen Datei gibt es nicht....
tbuch.PNG
tbuch.PNG (33.37 KiB) 9038 mal betrachtet

Re: suchen und anhängen

Verfasst: Fr, 30. Okt 2020 11:41
von Marcus Herz
Ein ADS Server läuft als Dienst und kennt keine gemappten Laufwerke, immer UNC verwenden!

Re: suchen und anhängen

Verfasst: Fr, 30. Okt 2020 11:49
von Manfred
ok, habe ich dann so gemacht jetzt

Code: Alles auswählen

EXECUTE PROCEDURE sp_addTableToDatabase('tbuch1_kopie','\\SAMBA42X\projekte\verkehrsbetriebe\tauschverzeichnis\fuhrparkverwaltung\webdienst\tbuch1_kopie',1,2,NULL,NULL)
poQuery: Error 7200: AQE Error: State = HY000; NativeError = 7013; [SAP][Advantage SQL Engine][ASA] Error 7013: Advantage server file access error. \\SAMBA42X\projekte\verkehrsbetriebe\tauschverzeichnis\fuhrparkverwaltung\webdienst\tbuch1_kopie.dbf
tbuch.PNG
tbuch.PNG (42.65 KiB) 9031 mal betrachtet