Seite 1 von 1

In Datenbank nach Wert suchen

Verfasst: Mi, 06. Dez 2017 15:48
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

Re: In Datenbank nach Wert suchen

Verfasst: Mi, 06. Dez 2017 16:08
von brandelh
nRechnungsnr2 wird hier nirgends gesetzt, der Wert wird aber gleich beim ersten Do While benötigt.

Re: In Datenbank nach Wert suchen

Verfasst: Mi, 06. Dez 2017 16:17
von vorti
nRechnungsnr1 und 2 werden davor belegt, steht hier nur nicht dabei.

Re: In Datenbank nach Wert suchen

Verfasst: Mi, 06. Dez 2017 18:38
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

Re: In Datenbank nach Wert suchen

Verfasst: Mi, 06. Dez 2017 19:01
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.

Re: In Datenbank nach Wert suchen

Verfasst: Mi, 06. Dez 2017 20:20
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

Re: In Datenbank nach Wert suchen

Verfasst: Mi, 06. Dez 2017 20:27
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:

Re: In Datenbank nach Wert suchen

Verfasst: Do, 07. Dez 2017 6:37
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 ;-)

Re: In Datenbank nach Wert suchen

Verfasst: Do, 07. Dez 2017 6:49
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

Re: In Datenbank nach Wert suchen

Verfasst: Do, 07. Dez 2017 8:55
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:

Re: In Datenbank nach Wert suchen

Verfasst: Do, 07. Dez 2017 9:03
von vorti
Mein (Haupt-)Fehler ging schon bei select() los, jetzt passt alles.

Vielen Dank an alle die geholfen haben.

Re: In Datenbank nach Wert suchen

Verfasst: Do, 07. Dez 2017 12:42
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.

Re: In Datenbank nach Wert suchen

Verfasst: Do, 07. Dez 2017 16:03
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...