Fórum Rotina Padrão para Gravar registro na tabela #368704

26/02/2009

0

:?:
Olá a todos.
Uso Delphi 7 + Firebird + DbExpress.

Estou fazendo uma rotina para gravar registros na tabela.
Os nomes dos campos da tabela e o nome do Edit correspondente ao campo guardo num ValueListEditor tudo fica como string.
=================
Key - - - - Value
Cli_Cod - - - EdtCodigo.Text
Cli_Nome- -- EdtNome.Text
Cli_Data- - -- EdtDtCadastro.Text

Observe que a esquerda (Key) fica o nome do campo da tabela
e a direita fica o nome do Edit que esta no Form.

Não estou conseguindo gravar observe o codigo.

procedure TFrCadastroPadrao.GravarMestre(Sender: TObject);
var
i, f, c : integer;
ct, cm, dad : string;
v_campo : string;
t_campo : TEdit;
begin

c := ValueListEditorCampos.RowCount;

for i := 1 to c do
begin
if V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[ 0 , i ]).DataType = ftstring then
V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[ 0 , i ]).AsString := ValueListEditorCampos.Cells[ 1 , i ];

if V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[ 0 , i ]).DataType = ftDate then
If ValueListEditorCampos.Cells[ 1 , i ] <> ´ / / ´ then // tem data
V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[ 0 , i ]).AsString := ValueListEditorCampos.Cells[ 1 , i ]
else
V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[ 0 , i ]).AsString := ´´;

if V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[ 0 , i ]).DataType = ftinteger then
V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[ 0 , i ]).AsInteger := V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[ 1 , i ]).AsInteger;
}

V_CliDtSt.Post
end;
end;

end;

A mensagem de erro que retorna é:
EdtDtCadastro.Text is not valid date.

Ele esta gravando no campo o nome da variavel (Edit) e não o conteúdo do Edit.
Nos campos string ele até grava mas o nome do Edit.

Preciso alguma coisa do tipo macro substituição mas não temos em Delphi.

Alguem saberia como me ajudar?
Abraços e obrigado
Neto


Neto

Neto

Responder

Posts

01/03/2009

Micheus

================= Key - - - - Value Cli_Cod - - - EdtCodigo.Text Cli_Nome- -- EdtNome.Text Cli_Data- - -- EdtDtCadastro.Text Observe que a esquerda (Key) fica o nome do campo da tabela e a direita fica o nome do Edit que esta no Form. : : A mensagem de erro que retorna é: EdtDtCadastro.Text is not valid date. Ele esta gravando no campo o nome da variavel (Edit) e não o conteúdo do Edit. Nos campos string ele até grava mas o nome do Edit. Neto
[b:faeecd40ee]Neto[/b:faeecd40ee], tudo o que está ocorrendo está correto.
Voce é que está distraído. Veja que vc mesmo diz que na primeira coluna (0) está o nome do campo e na segunda coluna (1) está o nome do edit.
Se vc olhar para seu código, verá que está movendo a segunda coluna para o campo do dataset, logo vc está movendo o nome do edit e não seu ´valor´.

O que vc precisaria fazer, baseado nesta sua idéia, seria buscar o componente no form baseado no nome ([i:faeecd40ee]FindComponent[/i:faeecd40ee]) que está na segunda coluna. Uma vez encontrado, então vc teria como obter o valor de sua propriedade Text.
Veja os tópicos com o método [url=http://forum.devmedia.com.br/search.php?mode=results]FindComponent[/url]

Duas dicas:
1) na verificação do tipo de dados, não use os [i:faeecd40ee]If´s[/i:faeecd40ee] do modo como fez. Em primeiro lugar, se ele for de um determinado tipo, não há porque testá-lo com outro tipo, então use [i:faeecd40ee]Else´s[/i:faeecd40ee] - imagine que vc teste todos os tipos de dados e o campo seja do primeiro tipo...
if V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[0, i]).DataType = ftstring then
V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[0, i]).AsString := ValueListEditorCampos.Cells[1, i]
else if V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[0 ,i]).DataType = ftDate then
...

Mas neste caso específico, vc pode até fazer uso da estrutura [i:faeecd40ee]Case Of[/i:faeecd40ee] que ficará muito melhor:
...
case V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[0, i]).DataType of
  ftString : ...
  ftDate : ...
  ftDateTime : ...
  ftTime : ...
  ftInteger : ...
end;
...

2)Quando o campo for ficar ´em branco´, não atribua ´´ use o método Clear que irá gravá-lo um nulo. No caso de fields do tipo [i:faeecd40ee]Date[/i:faeecd40ee] ou [i:faeecd40ee]DateTime[/i:faeecd40ee], quando vc passa o ´´ para o [i:faeecd40ee]AsString[/i:faeecd40ee] ele vai tentar fazer a conversão para date e retornará erro:
If Trim(ValueListEditorCampos.Cells[1, i]) <> ´/  /´ then // tem data
V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[0, i]).AsString := ValueListEditorCampos.Cells[1, i]
else
V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[0, i]).Clear;
Também no caso da data formatada, é conveniente que vc use o [i:faeecd40ee]trim[/i:faeecd40ee] do valor comparado com ´/bb/´ (onde o b é um espaço), porque se vc usar a formatação com 2 ou 4 dígitos para o ano o resultado do teste pode ser falso. (´ / / ´ se 2 dígitos e ´ / / ´ se 4 dígitos) - só para lembrá-lo destas possibilidades.

Abraços


Responder

Gostei + 0

01/03/2009

Marco Salles

Podia ter contiunuado no outro post pô...

function RetornarComponent(formulario:Tform;Nome:String):TEdit;
begin
result:=Formulario.findcomponent(Nome) as TEdit;
end;



procedure TForm1.Button1Click(Sender: TObject);
var
i, f, c : integer;
ct, cm, dad : string;
v_campo : string;
t_campo : TEdit;
begin
V_CliDtSt.Append;
try
   try
     for i := 1 to c do
       case  V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[ 0 , i ]).DataType of
         FtString:
         V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[ 0 , i ]).AsString :=
         (RetornarComponent(form1,ValueListEditorCampos.Cells[ 1 , i ])).Text;

         ftDate:
         V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[ 0 , i ]).AsString :=
         (RetornarComponent(form1,ValueListEditorCampos.Cells[ 1 , i ])).Text;

         ftinteger :
         V_CliDtSt.FieldByName(ValueListEditorCampos.Cells[ 0 , i ]).AsString :=
         (RetornarComponent(form1,ValueListEditorCampos.Cells[ 1 , i ])).Text;
      end;
    except
    //mensagemsn de erro
    V_CliDtSt.Cancel
   end;
  finally
     V_CliDtSt.Post;
  end;
end;



Responder

Gostei + 0

03/03/2009

Acneto

Ok Micheus,
obrigado pelas dicas, vou testar conforme sua recomendação.
Abraços.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar