Italian community of Lazarus and Free Pascal

Programmazione => Databases => Topic aperto da: ffabio - Gennaio 11, 2012, 02:39:32 pm

Titolo: qury dinamica - tdbgrid
Inserito da: ffabio - Gennaio 11, 2012, 02:39:32 pm
Ho un campo memo, dove scrivo le mia query .

la mando in esecuzione vorrei creare un grid dinamica .
dinamica nel senso che i campi possono variare .

 Come faccio a sapere i campi inseriti nella select ?? per crearmi una grid con lo stesso numero di campi??

esiste un metodo ??


grazie a tutti
Titolo: Re:qury dinamica - tdbgrid
Inserito da: xinyiman - Gennaio 11, 2012, 03:04:45 pm
basta che all'esecuzione della tua query quindi magari sul click del tasto che dovrebbe farti vedere il risultato nella DBGrid tu chiuda l'oggetto Query con Query.Close, gli cambi la proprieta Query.SQL.Text='nuova query'  e poi riapri la Query con Query.Open; dovrebbe riapparirti quello che cerchi!
Titolo: Re:qury dinamica - tdbgrid
Inserito da: ffabio - Gennaio 11, 2012, 03:18:31 pm
quello si .  era il numero di colonne della grid che non so come fare .

Titolo: Re:qury dinamica - tdbgrid
Inserito da: xinyiman - Gennaio 11, 2012, 03:20:38 pm
Ma non te ne devi preoccupare tu, fa tutto la DBGrid in automatico!
Titolo: Re:qury dinamica - tdbgrid
Inserito da: ffabio - Gennaio 11, 2012, 03:27:05 pm
spettacolo :-)
Titolo: Re:qury dinamica - tdbgrid
Inserito da: ffabio - Gennaio 11, 2012, 04:56:24 pm
funziona ci pensa lei devo solo capire come ridimensionare le colonne se non so quli sono .

con le colonne predefinite avevo usato il tuo suggerimento :

Grid1.Columns[0].width:=85;

adesso ??? idee ??
Titolo: Re:qury dinamica - tdbgrid
Inserito da: xinyiman - Gennaio 11, 2012, 05:01:00 pm
Bhe basta che fai un ciclo su tutte le colonne e le ridimensioni tutte. Così:

for i:=0 to Grid1.DataSource.DataSet.FieldCount-1 do
begin
     Grid1.Columns.width:=85;
end;

Ricordati solo di dichiarare i come un intero! Fammi sapere se ti funziona!
Titolo: Re:qury dinamica - tdbgrid
Inserito da: ffabio - Gennaio 11, 2012, 05:19:10 pm
non so la dimensione della colonna anche quella è in base al testo contenuto.


se lo scrivo senza ciclo mi pernde la dimensione del campo del db.

Titolo: Re:qury dinamica - tdbgrid
Inserito da: xinyiman - Gennaio 11, 2012, 05:21:20 pm
Questo dovrebbe fare al caso tuo!

Grid1.AutoSizeColumns;
Titolo: Re:qury dinamica - tdbgrid
Inserito da: ffabio - Gennaio 12, 2012, 09:50:25 am
non funziona  ::)

ho trovato questa procedura

procedure SetGridColumnWidths(Grid: Tdbgrid);
const
  DEFBORDER = 10;
var
  temp, n: Integer;
  lmax: array [0..30] of Integer;
begin
  with Grid do
  begin
    Canvas.Font := Font;
    for n := 0 to Columns.Count - 1 do
      //if columns[n].visible then
      lmax[n] := Canvas.TextWidth(Fields[n].FieldName) + DEFBORDER;
    grid.DataSource.DataSet.First;
    while not grid.DataSource.DataSet.EOF do
    begin
      for n := 0 to Columns.Count - 1 do
      begin
        //if columns[n].visible then begin
        temp := Canvas.TextWidth(trim(Columns[n].Field.DisplayText)) + DEFBORDER;
        if temp > lmax[n] then lmax[n] := temp;
        //end; { if }
      end; {for}
      grid.DataSource.DataSet.Next;
    end; { while }
    grid.DataSource.DataSet.First;
    for n := 0 to Columns.Count - 1 do
      if lmax[n] > 0 then
        Columns[n].Width := lmax[n];
  end; { With }
end; {SetGridColumnWidths  }

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetGridColumnWidths(dbgrid3);
end;


pero' mi da un errore

 lmax[n] := Canvas.TextWidth(Fields[n].FieldName) + DEFBORDER;

mi segna errore Fields ???? ideee ???


Titolo: Re:qury dinamica - tdbgrid
Inserito da: xinyiman - Gennaio 12, 2012, 09:59:47 am
Prova a cambiarlo da

Canvas.TextWidth(Fields[n].FieldName) + DEFBORDER;

a

Canvas.TextWidth(Grid.Fields[n].FieldName) + DEFBORDER;
Titolo: Re:qury dinamica - tdbgrid
Inserito da: ffabio - Gennaio 12, 2012, 10:03:09 am
no , mi dice

error: identifier no member "Fields"

altre idee
Titolo: Re:qury dinamica - tdbgrid
Inserito da: xinyiman - Gennaio 12, 2012, 10:13:09 am
Si hai ragione, questa è la sintassi corretta

      lmax[n] := Canvas.TextWidth(Grid.DataSource.DataSet.Fields[n].FieldName) + DEFBORDER;
Titolo: Re:qury dinamica - tdbgrid
Inserito da: ffabio - Gennaio 12, 2012, 10:21:02 am
si funziona grandeee 


grazie
Titolo: Re:qury dinamica - tdbgrid
Inserito da: xinyiman - Gennaio 12, 2012, 10:31:18 am
figurati :)
Titolo: Re:qury dinamica - tdbgrid
Inserito da: Scionn - Febbraio 04, 2012, 04:52:07 pm
Bè, l'avete fatta un pò complessa......

Se conosco le colonne che vado a mostrare e voglio decidere la loro larghezza posso agire in due modi:
 - da codice,
Grid1.Columns[0].width:=85;
Grid1.Columns[1].width:=185;
Grid1.Columns[2].width:=45;
Grid1.Columns[3].width:=85;
- da gui, inserendo la query, attibvando il dataset e poi aprendo il column editor del dataset, in qeusto modo posso aggiungere tute le colonne e gestirmi da editor tutti i parametri.

Se non conosco che colonne finiranno nella griglia tutto il discorso non ha senso, se non so se ci finira una data di sei caratteri o una descrizione di 255 perchè dovrei forzre le dimensioni, lascio l'auto che sarà sempre eccessivo ma funziona.

Pensando a un software che usa le griglia per mostrare dati conosiuti penso che il metodo da editor è il più comodo e più manutenibile, il metodo ca codice invece mi consente di essere più flessibile.

Visto che ci sono vorrei dare due dritte anche riguardo il problema segnalato dallo stesso utente su un articolo bloccato giorni fa.
Aveva fatto una select di una tabella, poi da griglia aggiornava i campi e quando cercava di salvarli questi davano errore.
Per gestire l'update dei campi di uan tabella in automatico ci sono due modi, o usi un componente ttable (cosa veramente brutta...) oppure usi un tzquery in congiunzione con un tzupdatesql (scusatemi se uso le classi di zeos, ma utilizzo questi componenti da anni e la mia testa oramai ragiona così) qui una volta definita la query della select, mediante l'editor ti fai creare in automatico tutte le query di editing e il sistema getisce tutto per te, uno spettacolo.

ciao ciao