Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: antoniog - Novembre 01, 2015, 12:24:18 am

Titolo: DBGrid - leggere un campo in modifica
Inserito da: antoniog - Novembre 01, 2015, 12:24:18 am
ho una dbgrid, con 3 campi visibili, collegata ad una tabella sqlite tramite un dataset. vorrei utilizzare il primo campo alfanumerico lungo 8 caratteri: codice,  per fare una ricerca su un'altra tabella con immissione parziale del codice, per esempio:
- il campo codice esistente 1.02.001
- voglio cambiare questo codice facendo una ricerca su un'altra tabella per codice che iniziano per 2.01, scelto il record che mi serve lo memorizzo, ma non sò come catturare il campo di immissione.
nella griglia immetto nel campo codice: 2.01 e nell'evento "onColexit" metto le seguenti istruzioni:
if not PConti.Locate('chiave', CausCLConto.Text, []) then
        begin
         PConti.Locate('chiave', CausCLConto.Text, [loPartialKey]) ;
        ScorriContiF.ShowModal;
        memorCausCl;
        end
else ...........
ma nella ricerca mi restituisce sempre in ScorriContiF.ShowModal, come prima riga, il valore del campo memorizzato cioè: 1.02.001     mentre io vorrei che si posizionasse sulla prima riga che comincia con: 2.01     . come faccio a catturare il campo in immissione e non ancora memorizzato?
Grazie in anticipo per le risposte.
Titolo: Re:DBGrid - leggere un campo in modifica
Inserito da: antoniog - Novembre 01, 2015, 11:59:19 am
spiego meglio. in un campo DBEdit posso utilizzare DBEdit.Text per fare una ricerca con Locate senza utilizzare il campo della tabella collegata, volevo sapere se i campi DBGrid hanno una proprietà text da utilizzare per lo stesso scopo.
Titolo: Re:DBGrid - leggere un campo in modifica
Inserito da: nomorelogic - Novembre 01, 2015, 08:51:53 pm
solitamente nella griglia il record corrente è lo stesso nel dataset; non hai bisogno di leggere dalla griglia: usa direttamente il campo del dataset.
Titolo: Re:DBGrid - leggere un campo in modifica
Inserito da: antoniog - Novembre 01, 2015, 09:12:21 pm
se uso dataset leggo il campo nel record della tabella ma io vorrei leggere quello che ho immesso nella cella della dbgrid per fare una ricerca.
una cosa così semplice sembra impossibile:
immetto un un valore, stringa o numero, in una cella della dbgrid, lo vedo ma non riesco ad utilizzarlo!?
Titolo: Re:DBGrid - leggere un campo in modifica
Inserito da: nomorelogic - Novembre 01, 2015, 11:37:55 pm
non l'ho mai provato con lazarus ma credo tu possa usare un campo DbLookupComboBox

ho trovato questo thread, forse ti può essere utile
http://forum.lazarus.freepascal.org/index.php?topic=17023.0
Titolo: Re:DBGrid - leggere un campo in modifica
Inserito da: antoniog - Novembre 02, 2015, 11:34:28 am
grazie. provo
Titolo: Re:DBGrid - leggere un campo in modifica
Inserito da: antoniog - Novembre 02, 2015, 12:54:44 pm
Ho capito il funzionamento di combobox ma non è quello che cerco. ho bisogno di un campo di immissione, TEdit, TDBEdit o altro, che mi consenta di immettere un dato da ricercare in una tabella, posso mettere un campo di immissione esterno alla DBGrid, così funziona, ma è poco elegante.
avrei bisogno di una  alternativa a : DBGrid1.SelectedField.Text con DBGrid1.SelectedCell.Text che non ho trovato.
Titolo: Re:DBGrid - leggere un campo in modifica (RISOLTO)
Inserito da: antoniog - Novembre 04, 2015, 02:00:23 pm
Ho risolto il problema, dopo varie ricerche sul web, adattando un esempio trovato, che non centrava nulla con quello che volevo, che mi ha dato l'intuizione per trovare la soluzione.
Ho inserito nella form un TEdit con la proprietà visible = False e sul campo da ricercare su un'altra tabella, nel mio caso CONTO, ho inserito negli EVENTI in -OnSetText-  il codice che cattura quanto inserito nel campo CONTO dopo avere premuto INVIO dalla tastiera e lo memorizza su -Edit1.Text- dopo di che faccio la ricerca con LOCATE su un'altra tabella e se mi va bene lo memorizzo.
Listato allegato

Codice: [Seleziona]

unit PrGridp;


{$mode objfpc}{$H+}


interface


uses
  LCLIntf, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, DBCtrls, ExtCtrls, DBGrids, DB, dbf, Sqlite3DS, FileUtil,
  ZConnection, ZDataset, LResources;




type


  { TProvaDBgrid }


  TProvaDBgrid = class(TForm)
    Datasource1: TDatasource;
    Datasource2: TDatasource;
    Datasource3: TDatasource;
    DBGrid1: TDBGrid;
    DBGrid2: TDBGrid;
    DBGrid3: TDBGrid;
    DBNavigator1: TDBNavigator;
    Edit1: TEdit;
    ZConnection1: TZConnection;
    ZTable1: TZTable;
    ZTable1CODCAUSALE: TLongintField;
    ZTable1CONTO: TStringField;
    ZTable1DAREAVERE: TStringField;
    ZTable1DESCRIZION: TStringField;
    ZTable2: TZTable;
    ZTable3: TZTable;
    ZTable3AVERPARTIT: TFloatField;
    ZTable3AVERPERIOD: TFloatField;
    ZTable3AVERPROGRE: TFloatField;
    ZTable3CHIAVE: TStringField;
    ZTable3CHIAVECEE: TStringField;
    ZTable3CONTO: TStringField;
    ZTable3CONTOCEE: TStringField;
    ZTable3DAREPARTIT: TFloatField;
    ZTable3DAREPERIOD: TFloatField;
    ZTable3DAREPROGRE: TFloatField;
    ZTable3DESCRICEE: TStringField;
    ZTable3DESCRIZIO: TStringField;
    ZTable3GRUPPO: TStringField;
    ZTable3IDBILANCIO: TLongintField;
    ZTable3INDANALBIL: TStringField;
    ZTable3PUNT1PRIMA: TLongintField;
    ZTable3PUNT2PRIMA: TLongintField;
    ZTable3SOTTOCONTO: TStringField;
    procedure DBGrid1EditButtonClick(Sender: TObject);
    procedure DBGrid1EditingDone(Sender: TObject);
    procedure ZTable1CONTOSetText(Sender: TField; const aText: string);




  private
    { private declarations }
  public
    { public declarations }
  var
  campo: string;
  end;
 procedure memorizza;


var
  ProvaDBgrid: TProvaDBgrid;


implementation


{$R *.lfm}
uses
  strutils, ContP;


{ TProvaDBgrid }


procedure TProvaDBgrid.DBGrid1EditButtonClick(Sender: TObject);
begin
  memorizza;
end;


procedure TProvaDBgrid.DBGrid1EditingDone(Sender: TObject);
begin
    memorizza;
end;


procedure TProvaDBgrid.ZTable1CONTOSetText(Sender: TField; const aText: string);
begin
  Sender.AsString := aText;
  campo:=Sender.AsString;
  Edit1.Text:= Sender.AsString;
  ZTable3.Locate('Chiave', Edit1.Text,[loPartialKey]);
end;


procedure memorizza;
begin
 try
  with    ProvaDBgrid do
   begin
    if not ZTable3.Locate('Chiave', Edit1.Text,[]) then
       begin
        ZTable3.Locate('Chiave', Edit1.Text,[loPartialKey]);
        ContF.Showmodal;
       end;
  if MessageDLG('Memorizzo i dati?',mtInformation,[mbOk, mbNo],0)= mrOk then
    begin
      if not (ZTable1.State=dsEdit) or not (ZTable1.State=dsInsert)  then
        begin
         ZTable1.Edit;
         ZTable1Conto.Text:=ZTable3Chiave.Text;
         ZTable1Descrizion.Text:=ZTable3Descrizio.Text;
         ZTable1.Refresh;
        end;
    end
    else
      ZTable1.Cancel;
   end;
 except
         on E: Exception do
      MessageDLG(E.Message+'......errore',mtInformation,[mbOk],0);
 end;
end;


end.
Titolo: Re:DBGrid - leggere un campo in modifica
Inserito da: antoniog - Novembre 04, 2015, 02:03:55 pm
chiedo venia ho invertito codice e testo  :)
Titolo: Re:DBGrid - leggere un campo in modifica
Inserito da: Legolas - Novembre 05, 2015, 05:33:07 pm
chiedo venia ho invertito codice e testo  :)

Ho messo a posto ;)
Titolo: Re:DBGrid - leggere un campo in modifica
Inserito da: antoniog - Novembre 05, 2015, 07:34:52 pm
grazie  :D