Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [Delphy] prelevo dati da firebird.....

    Premetto che non sono un programmatore professionista, lo faccio solo per diletto, ma mi piace capire per quello che posso.
    Ho una situazione nella quale devo prelevare un testo lungo posto in un database che si trova su più righe. Per spiegarmi ecco come e' fatta la tabella:

    Codice numriga testo
    912 1 xxxxxxxxx
    912 2 aaaaaaaa
    912 3 bbbbbbbb
    912 1 cccccccccc
    912 2 ffffffffffffff
    913 1 aaaaaaaaaa
    913 2 cccccccccc
    914 1 xxxxxxxxxx
    914 2 dddddddddd
    914 1 aaaaaaaaaa
    Questi sono dei prodotti con delle informazioni, io devo prelevare solo il codice ed il testo di quei prodotti dove il numero riga ricomincia da 1 di nuovo, e la prima parte. In poche parole di questi 3 prodotti devo solo prelevare le prime 3 righe del prodotto con codice 912 le altre 2 non mi servono. Poi il codice 913 non lo prelevo perche il numero riga non ricomincia da 1. Il codice 914 devo prelevare solo le prime 2 righe.

    codice:
    query2.Open;
    num_riga:=query2.FieldByName('num_riga').Asstring;
    testo:=query2.FieldByName('testo').AsString;
    testo:= '';
    while not query2.eof do
    begin
      testo := testo + trim(query2.fieldbyname('testo').Asstring) + chr(13) + chr(10);
      query2.Next;
    end;
    info_prof := testo;
    stringgrid1.Cells[1,1]:= codice;
    stringgrid1.Cells[2,1]:= info_prof;
    ListBox1.Items.Add(info_prof);
    memo1.lines.add(info_prof);
    Capisco che devo fare un ciclo ma:
    1) come faccio a distinguere i prodotti che hanno un numero riga che ricomincia da 1
    2) una volta individuati questi prodotti come faccio a prelevare solo quella porzione di testo?
    intanto io continuo le mie sperimentazioni e vi aggiorno
    grazie mille a tutti

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Innanzitutto, non è Delphy, ma Delphi.

    Detto questo, dal problema che hai esposto non si capisce la tua difficoltà, o meglio ciò che chiedi è chiaro ma non è corretto sviluppare la logica al posto tuo.

    Come estrarre informazioni dai campi mi pare tu sia riuscito a farlo, ad esempio utilizzando la proprietà AsString del campo specifico.

    Per implementare la logica, devi semplicemente memorizzare i riferimenti che estrai dai campi delle righe e verificare quando i valori di ciascuna riga, confrontati con quelli della precedente, fanno saltare la numerazione riguardando un altro numero di documento, o lo stesso, oppure un altro numero ma con riga che non parte da 1.

    Prova a scrivere il codice ed eventualmente a porre domande specifiche sulle difficoltà che riscontri in merito.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Assolutamente voglio implementare io la logica non sono il tipo che vuole la pappa pronta, perché' in questo modo non si impara mai.
    Comunque io ho pensato che per selezionare solo i prodotti in cui il numriga ricomincia da 1
    potrei fare una condizione if sulla presenza ripetuta 2 volte del numero 1, in poche parole se
    c'e' un duplicato del numero 1, perche' per ripartire la serie ci deve essere un'altro numero 1. Devo capire ancora come rintracciare una stringa duplicata
    Una volta che ho ottenuto solo i prodotti che mi interessano devo estrarre solo la prima serie di numero riga.
    grazie per la risposta

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Io farei in altro modo: quando scandisci i record, ti memorizzi ogni volta l'ultimo codice del prodotto che hai elaborato, e acquisisci il numero di riga.

    Quando vedi che il numero di riga riparte da 1, verifichi se il codice del prodotto corrente è uguale o diverso da quello precedente che ti eri salvato.

    Se è uguale, allora significa che la numerazione è ripartita per lo stesso prodotto, altrimenti si tratta di una nuova numerazione relativa a un prodotto nuovo.

    Analogamente, puoi fare la stessa cosa con il numero di riga, memorizzandolo a ogni iterazione del ciclo, per verificare se ciascun valore è progressivo rispetto al precedente (e quindi la sequenza è corretta), se la sequenza parte da 1 ed è quindi valida, e così via.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    ok stasera scrivo un po di codice
    grazie mille

  6. #6
    Ci sono quasi ho pero' dei seri problemi perche' non riesco a prelevare numero riga dal database come Integer
    Ed anche se lo prelevo come string, faccio un Trim
    e poi con StrToInt lo converto in intero mi da' sempre 0
    non capisco come mai?
    grazie

  7. #7
    codice:
                       num_riga:=trim(query2.FieldByName('num_riga').Asstring);                     riga1:=query2.FieldByName('num_riga').AsInteger;                     try                        riga_int := StrToInt(num_riga);                        except                        on EConvertError do showmessage('Errore');                     end;
    Catturando da stringa e convertendo esce errore ma comunque il valore e' 0
    stessa cosa catturando direttamente integer
    non capisco cosa sbaglio

  8. #8
    codice:
                   verifica :=0;               while not query2.eof do                 begin                         testo_prima:=testo;                        testo := testo + trim(query2.fieldbyname('testo').Asstring) + chr(13) + chr(10);                                    verifica := verifica +1;                  riga:=query2.FieldByName('num_riga').AsInteger;                if riga <> verifica then                   begin                    info_prof := testo_prima;                   verifica :=1;                end;                query2.Next;               end;                If (Memo1.Text <> '') Then Memo1.Clear;              //info_prof := testo;               stringgrid1.Cells[1,1]:= km10;               stringgrid1.Cells[2,1]:= info_prof;               //ListBox1.Items.Add(info_prof);                memo1.lines.add(info_prof);

    Credo di avercela fatta per il primo ciclo
    quell'errore di prima non so a cosa fosse dovuto ho riaperto un'altro progetto e non me lo da' piu'

    ora mi rimane da ciclare tutti i prodotti, ma ho un' altro problema nel memo riesco a mettere le righe una sotto l'altra, ma io devo salvarlo nella string grid per poi poterlo salvare su file excell.
    Il problema che ho e' che nella string grid il testo mi viene salvato di continuo, non andando a capo insomma.
    Come potrei risolvere questo problemino?
    grazie

  9. #9

    [Delphi] Finito-prelevo dati e scrittura stringgrid

    Questo e' il mio codice che metto ovviamente a disposizione di tutti, devo ringraziare vivamente Alka per le dritte che mi ha dato.
    Se puo' essere utile a qualcuno, io ho prelevato da una banca dati del testo che era su più record di uno stesso prodotto di un database, e l'ho riscritto su una stringgrid dalla quale poi sara' facilmente scrivibile su di un file di Excel.
    Ancora grazie a tutti
    codice:
     procedure TForm2.Button7Click(Sender: TObject);
     var
        codice,testo,cod_atcgmp,cod_ditta,desc_prodotto,info_prof:string ;
         num_agg,num_riga,testo_prima:string;
         filler1:string;
         intesa:boolean;
         verifica:integer;
         riga_int,giacenza:integer;
         riga, col,row:integer;
    begin
      query1.Close;
              query1.SQL.Text := 'select * from MAGAZZINO where ' +
                    '(codice starting with ''9'') and (web = ''si'')and (giac_totale>''500'')';
       query1.Open ;
       while not query1.eof do
        begin
                codice := query1.FieldByName('codice').AsString;
                giacenza := query1.FieldByName('giac_totale').AsInteger;
                query2.Close;
                query2.SQL.Text := 'select * from anagrafica where codice=:codice';
                query2.ParamByName('codice').AsString := codice;
                query2.Open;
                cod_ditta := query2.FieldByName('codice_ditta').AsString;           
                desc_prodotto := trim(query2.FieldByName('des').AsString);
           query2.Close;
    	//controllo se presente il testo  
           query2.SQL.Text := 'select num_agg,filler1 from banca_dati where  codice = :codice';
                  query2.ParamByName('codice').AsString := codice;
                   query2.Open;
                    num_agg:=query2.FieldByName('num_agg').Asstring;
                    filler1 := trim(query2.FieldByName('filler1').AsString);
            if (query2.IsEmpty = false) then
            begin
                intesa:=true;
                query2.Close;
                query2.SQL.Text := 'select * from banca_dati where  codice=:codice';
                query2.ParamByName('codice').AsString := codice;
                query2.Open;
                       num_riga:=trim(query2.FieldByName('num_riga').Asstring);
                        try
                           riga_int := StrToInt(num_riga);
                           except
                           on EConvertError do showmessage('Errore');
                        end;
                       testo:=query2.FieldByName('testo').AsString;
                       testo:= '';
                       verifica :=0;
                while not query2.eof do
                begin
                           testo_prima:=testo;
                           testo := testo + trim(query2.fieldbyname('testo').Asstring) + chr(13) + chr(10);
                           verifica := verifica +1;
                           riga:=query2.FieldByName('num_riga').AsInteger;
                     if riga <> verifica then
                      begin
                      info_prof := testo_prima;
                      verifica :=1;
                     end;
                query2.Next;
                end;
                   If (Memo1.Text <> '') Then Memo1.Clear;
    
                         stringgrid1.Cells[1,(stringgrid1.RowCount - 1)]:= km10;
                         stringgrid1.Cells[(2),(stringgrid1.RowCount - 1)]:= info_prof;
                         StringGrid1.RowCount:=StringGrid1.RowCount+1;
                
                   memo1.lines.add(info_prof);
    
          end;
    
        query1.next;
    
    
      end;
    
    
    end;

  10. #10
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Originariamente inviato da papaeredi
    Il problema che ho e' che nella string grid il testo mi viene salvato di continuo, non andando a capo insomma.
    Come potrei risolvere questo problemino?
    Quando hai un problema, posta sempre il codice, possibilmente usando la modalità avanzata del "Codice VB" per evitare che venga tutto su una riga.

    Inoltre, trattandosi di un problema diverso da quello trattato nella discussione, apri un nuovo thread.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.