In Datenbank nach Wert suchen

Eigentlich ist mir die Frage peinlich, aber es kann sonst niemand helfen ... :)

Moderator: Moderatoren

Antworten
vorti
UDF-Programmierer
UDF-Programmierer
Beiträge: 61
Registriert: Mo, 25. Sep 2017 12:21

In Datenbank nach Wert suchen

Beitrag von vorti »

Hallo,
kann mir jemand erklären wo bzw. warum das Array nicht gefüllt wird.

Code: Alles auswählen

select 4
if nRechnungsnr1#0

      do while nRechnungsnr1 < nRechnungsnr2
         locate for field -> rnr = nRechnungsnr1
         do while .not. Found()
            AAdd( aFehlendeRechung, str(nRechnungsnr1) )
         end do
         nRechnungsnr1++
      end do
   endif
   if Len( aFehlendeRechung ) = 0
      Ffehler()
   else
      FlisteRechnungen( aFehlendeRechung )
   endif
endif
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: In Datenbank nach Wert suchen

Beitrag von brandelh »

nRechnungsnr2 wird hier nirgends gesetzt, der Wert wird aber gleich beim ersten Do While benötigt.
Gruß
Hubert
vorti
UDF-Programmierer
UDF-Programmierer
Beiträge: 61
Registriert: Mo, 25. Sep 2017 12:21

Re: In Datenbank nach Wert suchen

Beitrag von vorti »

nRechnungsnr1 und 2 werden davor belegt, steht hier nur nicht dabei.
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: In Datenbank nach Wert suchen

Beitrag von ramses »

Dein Code einen Fehler.
Die Schlaufe nach locate wird nur durchlaufen wenn locate nichts findet und läuft dann unendlich (hängt) da sich die Bedingung .not. found() in der Schlaufe nicht ändert.

Was iat das Ziel deines Codes?

Gruss Carlo
Valar Morghulis

Gruss Carlo
vorti
UDF-Programmierer
UDF-Programmierer
Beiträge: 61
Registriert: Mo, 25. Sep 2017 12:21

Re: In Datenbank nach Wert suchen

Beitrag von vorti »

Die soll auch nur laufen wenn locate nichts findet.

Ziel ist folgendes. Ich habe ein Feld mit Nummern, z.B. durchgehend von 1-10 (außer die 7, die fehlt)
Und genau diese 7 will ich in diesem fall haben, also die Nr. die fehlt.
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: In Datenbank nach Wert suchen

Beitrag von ramses »

Du hast einen Fehler in deinem Code.

Code: Alles auswählen

do while .not. Found()
            AAdd( aFehlendeRechung, str(nRechnungsnr1) )
         end do   
angenommen deine 2 Parameter sind korrekt initialisiert also nRechnungsnr1 ist KLEINER nRechnungsnr2 und dir fehlt eine Nummer in diesem Bereich bleibt dein Code in der Schleife hängen bist der Speicher voll ist weil found() immer .f. bleibt. Ich vermute aber dass deine Parameter nicht korrekt sind und du deshalb schon nicht in die Schleife kommst.
Versuch doch mal das Programm im Debugger im Einzelschritt abzuarbeiten da kannst du deine Parameter prüfen.

Gruss Carlo
Valar Morghulis

Gruss Carlo
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: In Datenbank nach Wert suchen

Beitrag von AUGE_OHR »

vorti hat geschrieben: Mi, 06. Dez 2017 19:01 Die soll auch nur laufen wenn locate nichts findet.
dann überprüfe doch mal auf EOF() ... :roll:
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: In Datenbank nach Wert suchen

Beitrag von brandelh »

ramses hat geschrieben: Mi, 06. Dez 2017 20:20 Du hast einen Fehler in deinem Code.

Code: Alles auswählen

do while .not. Found()
            AAdd( aFehlendeRechung, str(nRechnungsnr1) )
         end do   
angenommen deine 2 Parameter sind korrekt initialisiert also nRechnungsnr1 ist KLEINER nRechnungsnr2 und dir fehlt eine Nummer in diesem Bereich bleibt dein Code in der Schleife hängen bist der Speicher voll ist weil found() immer .f. bleibt.
Gruss Carlo
da kann ich ramses nur zustimmen.
In dieser Situation wäre eine IF Abfrage richtig, da diese nur einmal durchlaufen wird und wieder zu locate zurück kommt.

Code: Alles auswählen

if .not. Found()
   AAdd( aFehlendeRechung, str(nRechnungsnr1) )
endif
In dieser Schleife wird ja kein erneutes locate ausgeführt, also dürfte found() nie wahr werden !
Somit müsste dein Programm sich hier aufhängen ... kann es sein, dass der code Schnipsel nicht vollständig ist ;-)
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: In Datenbank nach Wert suchen

Beitrag von brandelh »

vorti hat geschrieben: Mi, 06. Dez 2017 19:01 Die soll auch nur laufen wenn locate nichts findet.
Ziel ist folgendes. Ich habe ein Feld mit Nummern, z.B. durchgehend von 1-10 (außer die 7, die fehlt)
Und genau diese 7 will ich in diesem fall haben, also die Nr. die fehlt.
FÜr diese Aufgabe willst du also 10 mal die Datei mit Locate durchsuchen lassen ?
Das wird schnell sehr langsam, ich würde das in einem Durchgang erledigen ... wenn möglich mit dem Index vorher noch über Scope Sätze ausschließen

Code: Alles auswählen

* Scopen wenn möglich ... z.B. auf Rechnungsdatum oder von bis Rechnungsnummern ....
  aGibtEsNummern := {}
  GoTop()
  do while ! eof()
     if ! field->ID $ aGibEsNummer // falls nicht merken
        aadd(aGibEsNummer, field->ID)
     endif
     dbSkip()
  endif
* nun haben wir die Liste mit den vorhandenen IDs ...
  aSuchFehlene := {}
  for x := 1 to 10 // Grenzen Dynamisch ist besser
     if ! x $ aGibEsNummer // falls nicht merken
        aadd(aSuchFehlene, x)
     endif
  next 
  aGibtEsNummern := nil
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: In Datenbank nach Wert suchen

Beitrag von AUGE_OHR »

vorti hat geschrieben: Mi, 06. Dez 2017 15:48

Code: Alles auswählen

         locate for field -> rnr = nRechnungsnr1
         do while .not. Found()
wenn er bei einem LOCATE nichts findet steht er auf EOF() :boxing:
gruss by OHR
Jimmy
vorti
UDF-Programmierer
UDF-Programmierer
Beiträge: 61
Registriert: Mo, 25. Sep 2017 12:21

Re: In Datenbank nach Wert suchen

Beitrag von vorti »

Mein (Haupt-)Fehler ging schon bei select() los, jetzt passt alles.

Vielen Dank an alle die geholfen haben.
vorti
UDF-Programmierer
UDF-Programmierer
Beiträge: 61
Registriert: Mo, 25. Sep 2017 12:21

Re: In Datenbank nach Wert suchen

Beitrag von vorti »

Ich hab nochmal ein ähnliches Problem.
Diesmal sind die SuchParameter dDatum1 u. dDatum2.
Das Problem ist nach wie vor lücken in der Zahlenreihe zu finden.

Meine Idee war erstmal alle Zahlen in ein Array zu packen.Das funzt leider nicht, da es zu viele sind.
D.h. gleich auswerten.
Nur leider habe ich keine Ahnung wie ich die Bedingung herstellen soll, dass er nur Zahlen beachtet, die das entsprechende Datum zugeordnet haben.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: In Datenbank nach Wert suchen

Beitrag von brandelh »

schreibe mal bitte eine beispiel Tabelle mit Datum und Zahlen ... die Spalten auf die es ankommt und 4 bis 5 Zeilen,
deine Beschreibung ist nicht eindeutig...
Gruß
Hubert
Antworten