Seite 3 von 4

Re: suchen und anhängen

Verfasst: Mo, 11. Jan 2021 11:54
von Manfred
ich kann Dir mal wieder nicht folgen. Was muß ich da tun?

Re: suchen und anhängen

Verfasst: Mo, 11. Jan 2021 11:57
von Marcus Herz
Du musst zudem temporäre Dateien nicht dem Dic hinzufügen:

Code: Alles auswählen

select * from "\\myserver\myshare\mydir\temp.cdx" temp
so kannst du freie Tabellen verwenden, auch für JOINs etc.
Di können dann auch in einem anderen Verzeichnis stehen, nur der gleiche Server muss es sein

Re: suchen und anhängen

Verfasst: Mo, 11. Jan 2021 12:02
von Marcus Herz
Da haben sich unsere Antworten überschnitten...

Code: Alles auswählen

           TEXT INTO cSQLSTmt WRAP Chr(13) TRIMMED
                 MERGE tankbuch tb USING (select * from "e:\tauschverzeichnis\fuhrparkverwaltung\webdienst\tbuch1_kopie.dbf" tbk ) tbk
                 ON (tbk.kfznr=tb.kfznr AND tbk.tankdatum=tb.tankdatum AND tbk.tankzeit=tb.tankzeit)
                 WHEN NOT MATCHED THEN INSERT (art, kfznr, kmstand, menge, persnr, tankdatum, tankzeit, terminalnr) VALUES(tbk.art, tbk.kfznr, tbk.kmstand,tbk.menge, tbk.persnr,tbk.tankdatum, tbk.tankzeit, tbk.terminalnr)
            ENDTEXT

Re: suchen und anhängen

Verfasst: Mo, 11. Jan 2021 12:44
von Manfred
ah, es kann mit Laufwerksbuchstaben gearbeitet werden.

Re: suchen und anhängen

Verfasst: Mo, 11. Jan 2021 13:00
von Manfred
löst aber mein Problem nicht. Die Datei bleibt offen und kann am Ende nicht gelöscht werden. Oder sagen wir mal anders, sie bleibt für den Löschzugriff gesperrt. Wenn ich Workspacelist() aufrufe steht sie nicht drin, aber im ARC wird sie ale geöffnet angezeigt.

Re: suchen und anhängen

Verfasst: Mo, 11. Jan 2021 13:00
von Marcus Herz
- Besser ist UNC, hab nur den Pfad kopiert
- Laufwerksbuchstabe muss für den Server gültig sein

Re: suchen und anhängen

Verfasst: Mo, 11. Jan 2021 13:05
von Marcus Herz
JA, der ADS cached die letzten 20 Tabellen. Aus Performance Gründen, Ist auch so richtig.
Es gibt die

Code: Alles auswählen

AdsCloseCachedTables( ADSHANDLE hConnection )
Funktion, wie die du mit deiner Umgebung aufrufen kannst weiß ich nicht.
Der Hendle kann von DacSession ausgelesen werden, find aber auf die Schenlle nicht wo

Re: suchen und anhängen

Verfasst: Mo, 11. Jan 2021 19:13
von ramses
Den Handle bekommst du mit dieser Funktion

Code: Alles auswählen

static FUNCTION AdsExtGetConnectHandle( cServerPath )
   LOCAL nConnectHandle := 0
   LOCAL rc
   DEFAULT cServerPath TO SET(_SET_DEFAULT)
   rc := DllCall( "ACE32.DLL", DLL_STDCALL, "AdsFindConnection", @cServerPath, @nConnectHandle )
   AdsExtErrorCheck( rc )
return nConnectHandle

Re: suchen und anhängen

Verfasst: Do, 14. Jan 2021 8:33
von Manfred
Sorry,
aber es fällt mir schwer zu glauben, das es als Cache offen gehalten wird. Die DBF, aus der übernommen wird, bleibt so lange auf, bis das Programm einmal geschlossen wird ( mehr als 8 Stunden). Dann wird sie auch sofort geschlossen. Bzw. dann ist sie aus der Liste "open Files" im Architekten verschwunden.

Re: suchen und anhängen

Verfasst: Do, 14. Jan 2021 10:30
von Marcus Herz
Ich habe gestern beim Stöbern in PDR einen Eintrag gefunden, vielleicht trifft der ja für dich zu:

https://www.alaska-software.com/scripts ... PDRID=7290

Re: suchen und anhängen

Verfasst: Do, 14. Jan 2021 10:43
von Marcus Herz
dann ist sie aus der Liste "open Files" im Architekten verschwunden
das ist dann auch definitiv kein AdsCacheProblem, weil die siehst du von außen nicht als geöffnet.

Re: suchen und anhängen

Verfasst: So, 25. Jul 2021 12:45
von Manfred
Also, das hier klappt ja.

Code: Alles auswählen

MERGE tankbuch tb USING (SELECT * FROM "e:\tauschverzeichnis\fuhrparkverwaltung\webdienst\tbuch1_kopie.dbf" tbk ) tbk
                 ON (tbk.kfznr=tb.kfznr AND tbk.tankdatum=tb.tankdatum AND tbk.tankzeit=tb.tankzeit)
                 WHEN NOT MATCHED THEN INSERT (art, kfznr, kmstand, menge, persnr, tankdatum, tankzeit, terminalnr) VALUES(tbk.art, tbk.kfznr, tbk.kmstand,tbk.menge, tbk.persnr,tbk.tankdatum, tbk.tankzeit, tbk.terminalnr)
Jetzt würde ich aber gerne noch im gleichen Zug über "kfznr" in einer anderen Tabelle einen Satz suchen und dem dann den kmstand übergeben. Aber nur, wenn der neue höher ist als der, der dort eingetragen ist. Natürlich nur, wenn der Satz auch im Tankbuch angehängt wird.
Geht das in einem Rutsch, oder wie müßte man sowas lösen? Hat wer einen Vorschlag?
Es würde auch genügen, wenn die Sätze, die neu angehängt wurden in eine temporäre Tabelle geschrieben würden und ich dann am Ende diese durchlaufe und damit Suche und update.

Re: suchen und anhängen

Verfasst: Mo, 26. Jul 2021 12:32
von Marcus Herz
in einer anderen Tabelle einen Satz suchen und dem dann den kmstand übergeben
Das geht nicht im gleichen SQL, merge (update oder insert) kann nur in eine Datei schreiben.
Du könntest vor dem Merge (ich nehme an du hats keine LOG Felder, an denen du die neuen hinterher erkannen kannst)
den KM Stand schreiben:

Code: Alles auswählen

UPDATE <tabkmstand>
  SET kmstand = tbk.kmstand
  from <tabkmstand>
    left join "e:\tauschverzeichnis\fuhrparkverwaltung\webdienst\tbuch1_kopie.dbf" tbk ) tbk on tbk.kfznr = <tabkmstand>.kfznr
  WHERE kmstand < tbk.kmstand
  and not eixsts (
  SELECT *
    FROM tankbuch tb
    WHERE tbk.kfznr=tb.kfznr AND tbk.tankdatum=tb.tankdatum AND tbk.tankzeit=tb.tankzeit)
Ist ein wenig (zu) verschachtelt. Eine Tmp Tabelle erstellst du so:

Code: Alles auswählen

TRY drop table #tmp; CATCH ALL END TRY;

// neue Sätze ermitteln, das was ja im Merge auch passiert
SELECT * into #tmp
  FROM "e:\tauschverzeichnis\fuhrparkverwaltung\webdienst\tbuch1_kopie.dbf" tbk
  and not eixts (
  SELECT *
    FROM tankbuch tb
    WHERE tbk.kfznr=tb.kfznr AND tbk.tankdatum=tb.tankdatum AND tbk.tankzeit=tb.tankzeit)
    ;
// die neuen Sätze schreiben    
INSERT INTO tankbuch
         (art, kfznr, kmstand, menge, persnr, tankdatum, tankzeit, terminalnr)
  SELECT tbk.art, tbk.kfznr, tbk.kmstand,tbk.menge, tbk.persnr,tbk.tankdatum, tbk.tankzeit, tbk.terminalnr
  FROM #tmp tbk
  :
// kmstand aus den neuen Sätzen abfragen
UPDATE <tabkmstand>
  SET kmstand = tbk.kmstand
  from <tabkmstand>
    left join #tmp tbk on tbk.kfznr = <tabkmstand>.kfznr
  WHERE kmstand < tbk.kmstand
  ;
drop table #tmp;
Wie immer, mangels Tabellen, ungetestet

Re: suchen und anhängen

Verfasst: Mo, 26. Jul 2021 12:36
von Manfred
auh backe, das hatte ich befürchtet.
Ich glaube ich muß dann doch anders herangehen. Das soll ja auch nocht später von mir durchschaubar sein und bleiben.

Re: suchen und anhängen

Verfasst: Mo, 26. Jul 2021 12:39
von Manfred
aber andersherum gefragt, die Ursprungsdaten sind ja sequentiell angeordnet. Wenn ich jetzt bei dem MERGEN ermitteln könnte, ab welchem Satz gemerged wird, dann wäre das evtl. auch eine Möglichkeit dann später ab dem entsprechenden Satz die restlichen paar nochmal zu durchlaufen und dann die KM Stände zu übertragen. Es kommen ja nicht so viele täglich dazu. Es ist blos die gesamte Samllung, die die Tabelle so groß werden läßt-

Re: suchen und anhängen

Verfasst: Mo, 26. Jul 2021 12:41
von Marcus Herz
Ich hab in den Code mit Temp Tabelle noch Kommentare eingefügt. Hat den Vorteil, dass so immer auch bei Paralell Verarbetung das stimmt. Sich die letzte RowID zu merken, funktioniert auch, aber nur wenn nur von einer Anbwendung geschrieben wird

Re: suchen und anhängen

Verfasst: Mo, 26. Jul 2021 12:43
von Marcus Herz
die Ursprungsdaten sind ja sequentiell angeordnet.

Das gilt nciht mehr, ist zwar meistens so, aber keine Definition

Re: suchen und anhängen

Verfasst: Mo, 26. Jul 2021 12:46
von Manfred
halt, evtl. falsch verstanden.
Ich habe ja eine DBF in die immer nur angehängt wird. Diese wird durchlaufen und dann eben die neuen Sätze gemerged. Es wäre halt gut, wenn man wüßte ab welchem Satz aus der DBF in die neue Datei übertragen wird. Dann weiß ich das ich beim 2.Durchlauf in der DBF dahin springen muß um dann zu sagen:"mache den Rest und date up"

Re: suchen und anhängen

Verfasst: Mo, 26. Jul 2021 12:54
von Manfred
das ist alles Kappes, ich glaube ich löse das anders. Das läuft ja nur 1x in der Nacht und dann dauert es halt ein paar Sekunden länger. Ich durchlaufe danach die Fahrzeuge und prüfe nach, was ich an letzten Einträgen im Tankbuch habe und vergleiche das dann mit dem KMStand. Das sollte gnügen.

Re: suchen und anhängen

Verfasst: Mo, 26. Jul 2021 12:55
von Marcus Herz
für so Aufgaben, suche einen Satz etc. ist die SQL Engine zuständig. Das mache ich nicht mehr 'per Hand'. Der PRG Code wird viel schlanker und überischtlicher.
Es gibt eine Regel, wie upgedatet wird, und die muss abgearbeitet werden. Optimierungen gehören in die SQL Engine. (Ausnahmen bestätigen die Regel, aber mir scheint das hier keine zu sein)

Re: suchen und anhängen

Verfasst: Mo, 26. Jul 2021 13:01
von Manfred
verstehe ich zwar sprachlich, aber nicht technisch.
Ich würde jetzt die Fahrzeuge ermitteln und dann das Ergebnis durchlaufen und mir zu jedem Fahrzeug die Einträge im Tankbuch anzeigen lassen. Datumsortiert, aber das letzte an den Anfang. So brauche ich nur einen Satz zu vergleichen. Dann schaue ich nach wie der KMStand ist und tausche halt aus, wenn er höher ist als bisher im Fahrzeug steht.

Re: suchen und anhängen

Verfasst: Mo, 26. Jul 2021 13:14
von Marcus Herz
Für mich wars ein langer Weg weg von der Satz Denkweise, wahrscheinlich bin ich nicht der einzige, dem es so ging, aber wenn es mal klick gemacht hat, wird vieles so viel einfacher.
So wie ich es verstehe, ist in einer 2. Tabelle immer der letzte KM Stand gespeichert:

Code: Alles auswählen

update <kmstandtabelle>  set kmstand = t.kmstand
from <kmstandtabelle>
left join (select kfznr, max(kmstand) as kmstand from tankbuch group by 1) t on t.kfznr = <kmstandtabelle>.kfznr
where kmstand <> t.kmstand
Eigentlich ist es nicht relevant, ob sich der Wert geändert hat. Er muss übereinstimmen

Re: suchen und anhängen

Verfasst: Mo, 26. Jul 2021 13:33
von Marcus Herz
Manfred, was machst du eigentlich, wenn ein Auto ausgetauscht wird, aber wieder das gleiche Kennzeichen bekommt?

Re: suchen und anhängen

Verfasst: Mo, 26. Jul 2021 13:55
von Manfred
sagen wir mal so, es ist immer der letzte Eintrag zu dem Fahrzeug. Davor stehen unbegrenzt viele ältere. Und größer muß er sein, weil zwischendurch evtl. noch von woanders ein KM Stand herkommen kann, der dann evtl. höher ist als der letzte Tankstand. Oder falls mal jemand den KMStand falsch eingegeben hat. Wobei ich das nicht weiß, ob das händisch gemacht wird, oder ausgelesen wird.

Re: suchen und anhängen

Verfasst: Mo, 26. Jul 2021 13:56
von Manfred
Die Fahrzeuge werden intern nummeriert und haben einen QR-Code mit dem sie gescannt werden. Was das evtl. für Probleme noch geben kann wird die Zukunft zeigen. Noch ist das System erst in der Mache.