 |
ActiveDelphi .: O site do programador Delphi! :.
|
| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
flexsistemas Aprendiz

Registrado: Terça-Feira, 29 de Outubro de 2013 Mensagens: 121 Localização: Caxias do Sul
|
Enviada: Seg Dez 02, 2013 8:57 am Assunto: Campos Calculados ou Lookup em RunTime [RESOLVIDO] |
|
|
Bom dia,
Estou encapsulando o DBXpress e criei um componente chamado FlexEntidade que contém SDS+DSP+CDS em um componente só.
Fiz isso pois estou prevendo a minha migração para Firemonkey.
Estou com a seguinte dúvida:
Como posso criar campos calculados ou lookup em tempo de execução.
Fiz da seguinte forma:
1. Configurei o meu ClientDataSet:
| Código: |
function TFlexEntidade.GetClientDataSet: TClientDataSet;
begin
if not Assigned(FClientDataSet) then
begin
FClientDataSet := TClientDataSet.Create(Self);
FClientDataSet.Name := Self.Name+'_Cds';
FClientDataSet.AfterOpen := ConfiguraCamposCalculados;
FClientDataSet.AfterClose := DescarregaCamposCalculados;
FClientDataSet.OnCalcFields := FazCamposCalculados;
end;
Result := FClientDataSet;
end;
|
2. Vejam o que foi implementado em cada evento:
| Código: |
procedure TFlexEntidade.ConfiguraCamposCalculados(DataSet: TDataSet);
var
lIdx: SmallInt;
lField: TField;
lFlexCampos: TFlexCampos;
lIdx2: SmallInt;
begin
if Assigned(FCamposCalculados) and (FCamposCalculados.Count > 0) then
if not FInicializando then
begin
lFlexCampos := TFlexCampos.Create;
try
FInicializando := True;
DataSet.Active := False;
DataSet.FieldDefs.Update;
for lIdx := 0 to DataSet.FieldDefs.Count -1 do
begin
lField := DataSet.FieldDefs.Items[lIdx].FieldClass.Create(Self);
lField.FieldName := DataSet.FieldDefs.Items[lIdx].DisplayName;
lField.DataSet := DataSet;
for lIdx2 := 0 to CamposCalculados.Count -1 do
begin
lFlexCampos.Registro := CamposCalculados[lIdx2];
if (lFlexCampos.NomeDoCampo = lField.FieldName) then
begin
lField.FieldKind := fkCalculated;
lField.Required := False;
lField.Calculated := True;
lField.DisplayWidth := 255;
lField.Size := 255;
end;
end;
end;
DataSet.Active := True;
finally
FInicializando := False;
FreeAndNil(lFlexCampos);
end;
end;
end;
procedure TFlexEntidade.DescarregaCamposCalculados(DataSet: TDataSet);
var
lIdx: SmallInt;
lField: TField;
begin
if Assigned(FCamposCalculados) and (FCamposCalculados.Count > 0) then
if not FInicializando then
begin
for lIdx := DataSet.FieldCount -1 downto 0 do
begin
lField := Pointer(DataSet.Fields.Fields[lIdx]);
DataSet.Fields.Fields[lIdx].DataSet := nil;
FreeAndNil(lField);
end;
DataSet.FieldDefs.Clear;
end;
end;
procedure TFlexEntidade.FazCamposCalculados(DataSet: TDataSet);
var
lIdx: SmallInt;
lFlexCampos: TFlexCampos;
begin
if DataSet.State = dsCalcFields then
begin
lFlexCampos := nil;
try
for lIdx := 0 to CamposCalculados.Count -1 do
begin
if not Assigned(lFlexCampos) then
lFlexCampos := TFlexCampos.Create;
lFlexCampos.Registro := CamposCalculados[lIdx];
TMensagem.Mensagem(
'NomeDoCampo--->'+lFlexCampos.NomeDoCampo+#13#10+
'TabelaReferencia--->'+lFlexCampos.TabelaReferencia+#13#10+
'CampoTabelaReferencia--->'+lFlexCampos.CampoTabelaReferencia+#13#10+
'CampoRetTabelaReferencia--->'+lFlexCampos.CampoRetTabelaReferencia
);
end;
finally
if Assigned(lFlexCampos) then
FreeAndNil(lFlexCampos);
end;
end;
end;
|
Até aí tudo certo quando navego ele está fazendo a chamada tranquilamente. O problema está quando vou editar ou inserir um novo registro.
Ele abre um novo registro tranquilamente ou editar sem problemas mas quando vai salvar está apresentando a seguinte mensagem de erro:
"Field value required".
A Mensagem de erro ocorre ao Chamar o "Post" do ClientDataSet.
| Código: |
function TFlexEntidade.SalvaRegistro(const pConfirmar: Boolean): Boolean;
begin
try
Result := EntidadeAberta and EditandoRegistro;
if Result then
begin
AntesSalvar;
ClientDataSet.Post;
Result := True;
end;
except
raise;
end;
if pConfirmar then
begin
ConfirmarRegistro;
Atualizar;
end;
end;
|
Obrigado.
Editado pela última vez por flexsistemas em Ter Dez 03, 2013 8:16 am, num total de 1 vez |
|
| Voltar ao Topo |
|
 |
flexsistemas Aprendiz

Registrado: Terça-Feira, 29 de Outubro de 2013 Mensagens: 121 Localização: Caxias do Sul
|
Enviada: Seg Dez 02, 2013 12:25 pm Assunto: |
|
|
| up |
|
| Voltar ao Topo |
|
 |
flexsistemas Aprendiz

Registrado: Terça-Feira, 29 de Outubro de 2013 Mensagens: 121 Localização: Caxias do Sul
|
Enviada: Ter Dez 03, 2013 8:04 am Assunto: |
|
|
Resolvi da seguinte maneira:
=> Carregar os Campos no BeforeOpen
| Código: |
function TFlexEntidade.GetClientDataSet: TClientDataSet;
begin
if not Assigned(FClientDataSet) then
begin
FClientDataSet := TClientDataSet.Create(Self);
FClientDataSet.Name := Self.Name+'_Cds';
FClientDataSet.BeforeOpen := ConfiguraCampos;
FClientDataSet.AfterClose := DescarregaCamposLookup;
FClientDataSet.OnReconcileError := ErrosAoConfirmarRegistro;
FClientDataSet.OnPostError := ErrosAoGravarRegistro;
FClientDataSet.AfterScroll := AoTrocarRegistro;
end;
Result := FClientDataSet;
end;
|
| Código: |
procedure TFlexEntidade.ConfiguraCampos(DataSet: TDataSet);
var
lIdx: SmallInt;
lFlexCampos: TFlexCampos;
lFlexConsulta: TFlexConsulta;
lBlobField: TBlobField;
lStringField: TStringField;
lDateField: TDateField;
lSQLTimeStampField: TSQLTimeStampField;
lTimeField: TTimeField;
lIntegerField: TIntegerField;
lSmallIntField: TSmallintField;
lFMTBCDField: TFMTBCDField;
begin
if Assigned(FCamposLookup) and (FCamposLookup.Count > 0) then
begin
lFlexCampos := TFlexCampos.Create;
try
for lIdx := 0 to FCampos.Count -1 do
begin
lFlexCampos.Registro := FCampos[lIdx];
if not lFlexCampos.Lookup then
begin
if lFlexCampos.TipoDoCampo = 'DM_ID' then
begin
lIntegerField := TIntegerField.Create(DataSet);
lIntegerField.FieldName := lFlexCampos.NomeDoCampo;
lIntegerField.Dataset := DataSet;
lIntegerField.DisplayLabel := lFlexCampos.DescricaoDoCampo;
lIntegerField.Required := not lFlexCampos.PermiteEmBranco;
end else
if lFlexCampos.TipoDoCampo = 'DM_INTEIRO' then
begin
lIntegerField := TIntegerField.Create(DataSet);
lIntegerField.FieldName := lFlexCampos.NomeDoCampo;
lIntegerField.Dataset := DataSet;
lIntegerField.DisplayLabel := lFlexCampos.DescricaoDoCampo;
lIntegerField.Required := not lFlexCampos.PermiteEmBranco;
end else
if lFlexCampos.TipoDoCampo = 'DM_DESC_GRANDE' then
begin
lStringField := TStringField.Create(DataSet);
lStringField.FieldName := lFlexCampos.NomeDoCampo;
lStringField.Dataset := DataSet;
lStringField.DisplayLabel := lFlexCampos.DescricaoDoCampo;
lStringField.Required := not lFlexCampos.PermiteEmBranco;
lStringField.Size := 70;
lStringField.DisplayWidth := 70;
end else
if lFlexCampos.TipoDoCampo = 'DM_DESC_GRANDE2' then
begin
lStringField := TStringField.Create(DataSet);
lStringField.FieldName := lFlexCampos.NomeDoCampo;
lStringField.Dataset := DataSet;
lStringField.DisplayLabel := lFlexCampos.DescricaoDoCampo;
lStringField.Required := not lFlexCampos.PermiteEmBranco;
lStringField.Size := 150;
lStringField.DisplayWidth := 150;
end else
if lFlexCampos.TipoDoCampo = 'DM_DESC_GRANDE3' then
begin
lStringField := TStringField.Create(DataSet);
lStringField.FieldName := lFlexCampos.NomeDoCampo;
lStringField.Dataset := DataSet;
lStringField.DisplayLabel := lFlexCampos.DescricaoDoCampo;
lStringField.Required := not lFlexCampos.PermiteEmBranco;
lStringField.Size := 500;
lStringField.DisplayWidth := 500;
end else
if lFlexCampos.TipoDoCampo = 'DM_DESC_GRANDE4' then
begin
lStringField := TStringField.Create(DataSet);
lStringField.FieldName := lFlexCampos.NomeDoCampo;
lStringField.Dataset := DataSet;
lStringField.DisplayLabel := lFlexCampos.DescricaoDoCampo;
lStringField.Required := not lFlexCampos.PermiteEmBranco;
lStringField.Size := 1200;
lStringField.DisplayWidth := 1200;
end else
if lFlexCampos.TipoDoCampo = 'DM_DESC_GRANDE5' then
begin
lStringField := TStringField.Create(DataSet);
lStringField.FieldName := lFlexCampos.NomeDoCampo;
lStringField.Dataset := DataSet;
lStringField.DisplayLabel := lFlexCampos.DescricaoDoCampo;
lStringField.Required := not lFlexCampos.PermiteEmBranco;
lStringField.Size := 2000;
lStringField.DisplayWidth := 2000;
end else
if lFlexCampos.TipoDoCampo = 'DM_DESC_MEDIA' then
begin
lStringField := TStringField.Create(DataSet);
lStringField.FieldName := lFlexCampos.NomeDoCampo;
lStringField.Dataset := DataSet;
lStringField.DisplayLabel := lFlexCampos.DescricaoDoCampo;
lStringField.Required := not lFlexCampos.PermiteEmBranco;
lStringField.Size := 40;
lStringField.DisplayWidth := 40;
end else
if lFlexCampos.TipoDoCampo = 'DM_DESC_PEQUENA' then
begin
lStringField := TStringField.Create(DataSet);
lStringField.FieldName := lFlexCampos.NomeDoCampo;
lStringField.Dataset := DataSet;
lStringField.DisplayLabel := lFlexCampos.DescricaoDoCampo;
lStringField.Required := not lFlexCampos.PermiteEmBranco;
lStringField.Size := 20;
lStringField.DisplayWidth := 20;
end else
if lFlexCampos.TipoDoCampo = 'DM_DATA' then
begin
lDateField := TDateField.Create(DataSet);
lDateField.FieldName := lFlexCampos.NomeDoCampo;
lDateField.Dataset := DataSet;
lDateField.DisplayFormat := 'dd/mm/yyyy';
lDateField.EditMask := 'dd/mm/yyyy';
lDateField.DisplayLabel := lFlexCampos.DescricaoDoCampo;
lDateField.Required := not lFlexCampos.PermiteEmBranco;
end else
if lFlexCampos.TipoDoCampo = 'DM_DATA_HORA' then
begin
lSQLTimeStampField := TSQLTimeStampField.Create(DataSet);
lSQLTimeStampField.FieldName := lFlexCampos.NomeDoCampo;
lSQLTimeStampField.Dataset := DataSet;
lSQLTimeStampField.DisplayFormat := 'dd/mm/yyyy hh:nn';
lSQLTimeStampField.EditMask := 'dd/mm/yyyy hh:nn';
lSQLTimeStampField.DisplayLabel := lFlexCampos.DescricaoDoCampo;
lSQLTimeStampField.Required := not lFlexCampos.PermiteEmBranco;
end else
if lFlexCampos.TipoDoCampo = 'DM_HORA' then
begin
lTimeField := TTimeField.Create(DataSet);
lTimeField.FieldName := lFlexCampos.NomeDoCampo;
lTimeField.Dataset := DataSet;
lTimeField.DisplayFormat := 'hh:nn';
lTimeField.EditMask := 'hh:nn';
lTimeField.DisplayLabel := lFlexCampos.DescricaoDoCampo;
lTimeField.Required := not lFlexCampos.PermiteEmBranco;
end else
if lFlexCampos.TipoDoCampo = 'DM_INTEIRO3' then
begin
lSmallIntField := TSmallIntField.Create(DataSet);
lSmallIntField.FieldName := lFlexCampos.NomeDoCampo;
lSmallIntField.Dataset := DataSet;
lSmallIntField.DisplayLabel := lFlexCampos.DescricaoDoCampo;
lSmallIntField.Required := not lFlexCampos.PermiteEmBranco;
end else
if lFlexCampos.TipoDoCampo = 'DM_PERCENT' then
begin
lFMTBCDField := TFMTBCDField.Create(DataSet);
lFMTBCDField.FieldName := lFlexCampos.NomeDoCampo;
lFMTBCDField.Dataset := DataSet;
lFMTBCDField.DisplayLabel := lFlexCampos.DescricaoDoCampo;
lFMTBCDField.Required := not lFlexCampos.PermiteEmBranco;
lFMTBCDField.DisplayFormat := '##0.00';
lFMTBCDField.EditFormat := '##0.00';
lFMTBCDField.Precision := 10;
lFMTBCDField.Size := 2;
end else
if lFlexCampos.TipoDoCampo = 'DM_SIGLA_1' then
begin
lStringField := TStringField.Create(DataSet);
lStringField.FieldName := lFlexCampos.NomeDoCampo;
lStringField.Dataset := DataSet;
lStringField.DisplayLabel := lFlexCampos.DescricaoDoCampo;
lStringField.Required := not lFlexCampos.PermiteEmBranco;
lStringField.FixedChar := True;
lStringField.Size := 1;
lStringField.DisplayWidth := 1;
end else
if lFlexCampos.TipoDoCampo = 'DM_SIGLA_2' then
begin
lStringField := TStringField.Create(DataSet);
lStringField.FieldName := lFlexCampos.NomeDoCampo;
lStringField.Dataset := DataSet;
lStringField.DisplayLabel := lFlexCampos.DescricaoDoCampo;
lStringField.Required := not lFlexCampos.PermiteEmBranco;
lStringField.FixedChar := True;
lStringField.Size := 2;
lStringField.DisplayWidth := 2;
end else
if lFlexCampos.TipoDoCampo = 'DM_SIGLA_3' then
begin
lStringField := TStringField.Create(DataSet);
lStringField.FieldName := lFlexCampos.NomeDoCampo;
lStringField.Dataset := DataSet;
lStringField.DisplayLabel := lFlexCampos.DescricaoDoCampo;
lStringField.Required := not lFlexCampos.PermiteEmBranco;
lStringField.FixedChar := True;
lStringField.Size := 3;
lStringField.DisplayWidth := 3;
end else
if lFlexCampos.TipoDoCampo = 'DM_SIGLA_5' then
begin
lStringField := TStringField.Create(DataSet);
lStringField.FieldName := lFlexCampos.NomeDoCampo;
lStringField.Dataset := DataSet;
lStringField.DisplayLabel := lFlexCampos.DescricaoDoCampo;
lStringField.Required := not lFlexCampos.PermiteEmBranco;
lStringField.FixedChar := True;
lStringField.Size := 5;
lStringField.DisplayWidth := 5;
end else
if lFlexCampos.TipoDoCampo = 'DM_SIGLA_7' then
begin
lStringField := TStringField.Create(DataSet);
lStringField.FieldName := lFlexCampos.NomeDoCampo;
lStringField.Dataset := DataSet;
lStringField.DisplayLabel := lFlexCampos.DescricaoDoCampo;
lStringField.Required := not lFlexCampos.PermiteEmBranco;
lStringField.FixedChar := True;
lStringField.Size := 7;
lStringField.DisplayWidth := 7;
end else
if lFlexCampos.TipoDoCampo = 'DM_SIM_NAO' then
begin
lStringField := TStringField.Create(DataSet);
lStringField.FieldName := lFlexCampos.NomeDoCampo;
lStringField.Dataset := DataSet;
lStringField.DisplayLabel := lFlexCampos.DescricaoDoCampo;
lStringField.Required := not lFlexCampos.PermiteEmBranco;
lStringField.DefaultExpression := '''N''';
lStringField.FixedChar := True;
lStringField.Size := 1;
lStringField.DisplayWidth := 1;
end else
if lFlexCampos.TipoDoCampo = 'DM_VALOR_2DC' then
begin
lFMTBCDField := TFMTBCDField.Create(DataSet);
lFMTBCDField.FieldName := lFlexCampos.NomeDoCampo;
lFMTBCDField.Dataset := DataSet;
lFMTBCDField.DisplayLabel := lFlexCampos.DescricaoDoCampo;
lFMTBCDField.Required := not lFlexCampos.PermiteEmBranco;
lFMTBCDField.DisplayFormat := '###,###,##0.00';
lFMTBCDField.EditFormat := '###,###,##0.00';
lFMTBCDField.Precision := 19;
lFMTBCDField.Size := 2;
lFMTBCDField.currency := True;
end else
if lFlexCampos.TipoDoCampo = 'DM_VALOR_3DC' then
begin
lFMTBCDField := TFMTBCDField.Create(DataSet);
lFMTBCDField.FieldName := lFlexCampos.NomeDoCampo;
lFMTBCDField.Dataset := DataSet;
lFMTBCDField.DisplayLabel := lFlexCampos.DescricaoDoCampo;
lFMTBCDField.Required := not lFlexCampos.PermiteEmBranco;
lFMTBCDField.DisplayFormat := '###,###,##0.000';
lFMTBCDField.EditFormat := '###,###,##0.000';
lFMTBCDField.Precision := 19;
lFMTBCDField.Size := 3;
lFMTBCDField.currency := True;
end else
if lFlexCampos.TipoDoCampo = 'DM_VALOR_4DC' then
begin
lFMTBCDField := TFMTBCDField.Create(DataSet);
lFMTBCDField.FieldName := lFlexCampos.NomeDoCampo;
lFMTBCDField.Dataset := DataSet;
lFMTBCDField.DisplayLabel := lFlexCampos.DescricaoDoCampo;
lFMTBCDField.Required := not lFlexCampos.PermiteEmBranco;
lFMTBCDField.DisplayFormat := '###,###,##0.0000';
lFMTBCDField.EditFormat := '###,###,##0.0000';
lFMTBCDField.Precision := 19;
lFMTBCDField.Size := 4;
lFMTBCDField.currency := True;
end else
if lFlexCampos.TipoDoCampo = 'DM_VALOR_6DC' then
begin
lFMTBCDField := TFMTBCDField.Create(DataSet);
lFMTBCDField.FieldName := lFlexCampos.NomeDoCampo;
lFMTBCDField.Dataset := DataSet;
lFMTBCDField.DisplayLabel := lFlexCampos.DescricaoDoCampo;
lFMTBCDField.Required := not lFlexCampos.PermiteEmBranco;
lFMTBCDField.DisplayFormat := '###,###,##0.000000';
lFMTBCDField.EditFormat := '###,###,##0.000000';
lFMTBCDField.Precision := 19;
lFMTBCDField.Size := 6;
lFMTBCDField.currency := True;
end else
if lFlexCampos.TipoDoCampo = 'DM_VALOR_8DC' then
begin
lFMTBCDField := TFMTBCDField.Create(DataSet);
lFMTBCDField.FieldName := lFlexCampos.NomeDoCampo;
lFMTBCDField.Dataset := DataSet;
lFMTBCDField.DisplayLabel := lFlexCampos.DescricaoDoCampo;
lFMTBCDField.Required := not lFlexCampos.PermiteEmBranco;
lFMTBCDField.DisplayFormat := '###,###,##0.00000000';
lFMTBCDField.EditFormat := '###,###,##0.00000000';
lFMTBCDField.Precision := 19;
lFMTBCDField.Size := 8;
lFMTBCDField.currency := True;
end else
if lFlexCampos.TipoDoCampo = 'DM_ARQUIVO' then
begin
lBlobField := TBlobField.Create(DataSet);
lBlobField.FieldName := lFlexCampos.NomeDoCampo;
lBlobField.Dataset := DataSet;
lBlobField.DisplayLabel := lFlexCampos.DescricaoDoCampo;
lBlobField.Required := not lFlexCampos.PermiteEmBranco;
end else
if lFlexCampos.TipoDoCampo = 'DM_EMAIL' then
begin
lStringField := TStringField.Create(DataSet);
lStringField.FieldName := lFlexCampos.NomeDoCampo;
lStringField.Dataset := DataSet;
lStringField.DisplayLabel := lFlexCampos.DescricaoDoCampo;
lStringField.Required := not lFlexCampos.PermiteEmBranco;
lStringField.Size := 50;
lStringField.DisplayWidth := 50;
end else
if lFlexCampos.TipoDoCampo = 'DM_FOTO' then
begin
lBlobField := TBlobField.Create(DataSet);
lBlobField.FieldName := lFlexCampos.NomeDoCampo;
lBlobField.Dataset := DataSet;
lBlobField.DisplayLabel := lFlexCampos.DescricaoDoCampo;
lBlobField.Required := not lFlexCampos.PermiteEmBranco;
end else
if lFlexCampos.TipoDoCampo = 'DM_MEMO' then
begin
lBlobField := TBlobField.Create(DataSet);
lBlobField.FieldName := lFlexCampos.NomeDoCampo;
lBlobField.Dataset := DataSet;
lBlobField.DisplayLabel := lFlexCampos.DescricaoDoCampo;
lBlobField.Required := not lFlexCampos.PermiteEmBranco;
end;
end;
end;
for lIdx := 0 to FCamposLookup.Count -1 do
begin
lFlexCampos.Registro := FCamposLookup[lIdx];
lFlexConsulta := Pointer(CamposLookup.Objects[lIdx]);
if Assigned(lFlexConsulta) then
begin
lStringField := TStringField.Create(DataSet);
lStringField.FieldName := lFlexCampos.NomeDoCampo;
lStringField.KeyFields := lFlexCampos.CampoReferencia;
lStringField.LookupDataSet := lFlexConsulta.ClientDataSet;
lStringField.LookupKeyFields := lFlexCampos.CampoTabelaReferencia;
lStringField.LookupResultField := lFlexCampos.CampoRetTabelaReferencia;
lStringField.FieldKind := fkLookup;
lStringField.Dataset := DataSet;
lStringField.DisplayWidth := 255;
lStringField.Size := 255;
lStringField.Lookup := True;
end;
end;
finally
FreeAndNil(lFlexCampos);
end;
end;
end;
|
| Código: |
procedure TFlexEntidade.DescarregaCamposLookup(DataSet: TDataSet);
var
lIdx: SmallInt;
lField: TField;
begin
if Assigned(FCamposLookup) and (FCamposLookup.Count > 0) then
begin
for lIdx := DataSet.FieldCount -1 downto 0 do
begin
lField := Pointer(DataSet.Fields.Fields[lIdx]);
DataSet.Fields.Fields[lIdx].DataSet := nil;
FreeAndNil(lField);
end;
DataSet.FieldDefs.Clear;
end;
end;
|
|
|
| Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|