Ir para conteúdo
  • Cadastre-se

Fabrício Melo

Membros
  • Total de ítens

    224
  • Registro em

  • Última visita

Posts postados por Fabrício Melo

  1. Boa noite, estou a tarde toda tentando descobrir o motivo desse erro, de uma hora pra outra passou a dar, atualizei meus componentes e só mudou o erro que era

    820 - Rejeição: Informado produto fiscal de NFF

    para 

    833 - Rejeição: Informada embalagem do produto

    Busquei informações sobre e achei somente essa nota técnica 

    Projeto Nota Fiscal Eletrônica
    Nota Técnica 2021.002
    Adequações para Nota Fiscal Fácil
    image.thumb.png.ef8e9ff19f89210fa8c4dc5d65af3cbf.pngAdequações para Nota Fiscal Fácil
    Versão 1.00 – Março 2021

    Não tenho a mínima ideia de como passei a receber essas validações, pois ate o momento do primeiro erro não tinha alterado nada no meu emissor...

    Grato.

    Erro 833 NF-e.xml

  2. Na classe acima não tem a opção de modificar as informações depois de criado o componente e carregado os fields, então lembre que precisamos modificar em algum momento sem mexer no que esta pronto...

    {---------------------------------------------------------}
    {  Autor: Fabrício Melo                                   }
    {  e-Mail: [email protected]                               }
    {  skype: fabricio_ftm                                    }
    {  Desenvolvedor Delphi                                   }
    {                                                         }
    {  Componente derivado da TFDQuery, exemplo de como       }
    { escrever uma Tabela e configurar seus campos sem a      }
    { necessidade de usar o Fields Editor do DataSet.         }
    { O Trablho esta em Criar um executável que conecte no    }
    { Banco de Dados e depois modifique essa classe para as   }
    { informaçoes da Tabela desejada, linha a linha. ;)       }
    {---------------------------------------------------------}
    unit UTypeCode;
    
    interface 
     
    uses 
      Classes, DB, SysUtils, MaskUtils, Math, DateUtils,
      FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Param,
      FireDAC.Stan.Error, FireDAC.DatS, FireDAC.Phys.Intf,
      FireDAC.DApt.Intf, FireDAC.Stan.Async, FireDAC.DApt,
      FireDAC.Comp.DataSet, FireDAC.Comp.Client;
     
    const
      //Identificação da Tabela
      TBL_FIELD = 'DATA_TYPE_CODE';
      //Generators
      GEN_FIELD = 'GEN_FIELD_ID';
      //Campos da Tabela
      FDN_FIELD_SMALLINT = 'FIELD_SMALLINT';
      FDN_FIELD_INTEGER = 'FIELD_INTEGER';
      FDN_FIELD_BIGINT = 'FIELD_BIGINT';
      FDN_FIELD_FLOAT = 'FIELD_FLOAT';
      FDN_FIELD_DOUBLE_PRECISION = 'FIELD_DOUBLE_PRECISION';
      FDN_FIELD_NUMERIC = 'FIELD_NUMERIC';
      FDN_FIELD_DECIMAL = 'FIELD_DECIMAL';
      FDN_FIELD_DATE = 'FIELD_DATE';
      FDN_FIELD_TIME = 'FIELD_TIME';
      FDN_FIELD_TIMESTAMP = 'FIELD_TIMESTAMP';
      FDN_FIELD_CHAR = 'FIELD_CHAR';
      FDN_FIELD_VARCHAR = 'FIELD_VARCHAR';
      FDN_FIELD_BLOB = 'FIELD_BLOB';
      //Título dos Campos da Tabela
      CPT_FIELD_SMALLINT = 'Field Smallint';
      CPT_FIELD_INTEGER = 'Field Integer';
      CPT_FIELD_BIGINT = 'Field Bigint';
      CPT_FIELD_FLOAT = 'Field Float';
      CPT_FIELD_DOUBLE_PRECISION = 'Field Double Precision';
      CPT_FIELD_NUMERIC = 'Field Numeric';
      CPT_FIELD_DECIMAL = 'Field Decimal';
      CPT_FIELD_DATE = 'Field Date';
      CPT_FIELD_TIME = 'Field Time';
      CPT_FIELD_TIMESTAMP = 'Field Timestamp';
      CPT_FIELD_CHAR = 'Field Char';
      CPT_FIELD_VARCHAR = 'Field Varchar';
      CPT_FIELD_BLOB = 'Field Blob';
    
    type
    
     TFDQueryTypeCode = class(TFDQuery)
      private
        //Flag para não recriar os Fields ao Abrir o proprietário
        FActiveFieldsExecute: Boolean;
        //Armazenar o proprietário
        FOwner: TComponent;
        //Fields
        FFIELD_SMALLINT: TSmallintField;
        FFIELD_INTEGER: TIntegerField;
        FFIELD_BIGINT: TLargeintField;
        FFIELD_FLOAT: TSingleField;
        FFIELD_DOUBLE_PRECISION: TFloatField;
        FFIELD_NUMERIC: TFMTBCDField;
        FFIELD_DECIMAL: TFMTBCDField;
        FFIELD_DATE: TDateField;
        FFIELD_TIME: TTimeField;
        FFIELD_TIMESTAMP: TSQLTimeStampField;
        FFIELD_CHAR: TStringField;
        FFIELD_VARCHAR: TStringField;
        FFIELD_BLOB: TMemoField;
    
        FActiveFields: Boolean;
    
        procedure SetActiveFields(const Value: Boolean);
    
      public
        //Criação do Objeto
        constructor Create(AOwner: TComponent); override;
        //Depois de Criado
        procedure AfterConstruction; override;
        //Criar os campos na Query...
        procedure CreateFields(AOwner: TComponent);
        //Configurar os campos na Query...
        procedure ConfigureFields;
        //Validar as informações dos Campos
        procedure ValidateFields;
        //Valores Padrões dos Campos Obrigatórios
        procedure ValueDefault;
        //Comando SQL da Tabela
        procedure CommandSQL;
    
      protected
        //Antes de Gravar
        procedure DoBeforePost; override;
        //Antes de Abrir
        procedure DoBeforeOpen; override;
        //Inicializar Campos
        procedure DoAfterInsert; override;
        //Recarregar o Comando SQL Original
        procedure DoAfterClose; override;
    
      published
        //Criar os Campos
        property ActiveFields: Boolean read FActiveFields write SetActiveFields default False;
    
     end;
    
    procedure Register;
    
    implementation
    
    { TFDTaTypeCode }
    
    procedure Register;
    begin
      //Paleta de Ferramentas
      RegisterComponents('Minha Paleta Delphi', [ TFDQueryTypeCode ]);
     
    end;
    
    constructor TFDQueryTypeCode.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
    
      //Armazenar o Form ou DM Proprietário
      FOwner                         := AOwner;
      //Aplicar as Configurações desejadas na Query
      UpdateOptions.GeneratorName    := GEN_FIELD;
      UpdateOptions.UpdateTableName  := TBL_FIELD;
      UpdateOptions.KeyFields        := FDN_FIELD_SMALLINT;
      UpdateOptions.AssignedValues   := [uvGeneratorName];
      CachedUpdates                  := True;
      AggregatesActive               := True;
    
      FActiveFieldsExecute           := False;
    
    end; 
     
    procedure TFDQueryTypeCode.AfterConstruction;
    begin 
      inherited;
      //Carregar o Comando SQL
      CommandSQL; 
     
    end; 
     
    procedure TFDQueryTypeCode.CommandSQL;
    {-- Tabela Exemplo - Firebird
      CREATE TABLE DATA_TYPE_CODE (
        FIELD_SMALLINT          SMALLINT,
        FIELD_INTEGER           INTEGER,
        FIELD_BIGINT            BIGINT,
        FIELD_FLOAT             FLOAT,
        FIELD_DOUBLE_PRECISION  DOUBLE PRECISION,
        FIELD_NUMERIC           NUMERIC(16,8),
        FIELD_DECIMAL           DECIMAL(18,6),
        FIELD_DATE              DATE,
        FIELD_TIME              TIME,
        FIELD_TIMESTAMP         TIMESTAMP,
        FIELD_CHAR              CHAR(1),
        FIELD_VARCHAR           VARCHAR(100),
        FIELD_BLOB              BLOB SUB_TYPE 1 SEGMENT SIZE 1024);
    }
    begin 
      inherited; 
    
      SQL.Add('SELECT '); 
      SQL.Add('       FIELD.FIELD_SMALLINT ');
      SQL.Add('      ,FIELD.FIELD_INTEGER ');
      SQL.Add('      ,FIELD.FIELD_BIGINT ');
      SQL.Add('      ,FIELD.FIELD_FLOAT ');
      SQL.Add('      ,FIELD.FIELD_DOUBLE_PRECISION ');
      SQL.Add('      ,FIELD.FIELD_NUMERIC ');
      SQL.Add('      ,FIELD.FIELD_DECIMAL ');
      SQL.Add('      ,FIELD.FIELD_DATE ');
      SQL.Add('      ,FIELD.FIELD_TIME ');
      SQL.Add('      ,FIELD.FIELD_TIMESTAMP ');
      SQL.Add('      ,FIELD.FIELD_CHAR ');
      SQL.Add('      ,FIELD.FIELD_VARCHAR ');
      SQL.Add('      ,FIELD.FIELD_BLOB ');
      SQL.Add('  FROM DATA_TYPE_CODE FIELD ');
      SQL.Add(' WHERE (1=1) ');
    
      {Para usar no form:
        Query.Close;
        Query.SQL.Add(' AND FIELD_SMALLINT = 1982 ');
        Query.Open;
      }
    end; 
    
    procedure TFDQueryTypeCode.SetActiveFields(const Value: Boolean);
    begin
    
      FActiveFields := Value;
      //Flag pra controlar no Create do Proprietário
      if FActiveFieldsExecute then
        if FOwner <> nil then
          //Criando os Campos no DataSet em Desenvolvimento
          if ( csDesigning in Self.ComponentState ) then
          begin
            //Remove do DataSet e do Proprietário
            if Self.FieldCount > 0 then
              Self.Fields.Clear;
            //Criar os Campos Novamente no DataSet e no Proprietário
            if FActiveFields then
              CreateFields(FOwner);
          end;
    
      FActiveFieldsExecute := True;
    
    end;
    
    procedure TFDQueryTypeCode.CreateFields(AOwner: TComponent);
    begin
      //Tipos Comuns do Firebird
      FFIELD_SMALLINT             := TSmallintField.Create(AOwner);
      FFIELD_SMALLINT.FieldKind   := fkData;
      FFIELD_SMALLINT.Origin      := FDN_FIELD_SMALLINT;
      FFIELD_SMALLINT.fieldName   := FDN_FIELD_SMALLINT;
      FFIELD_SMALLINT.Name        := Self.Name + FDN_FIELD_SMALLINT;
      FFIELD_SMALLINT.Index       := Self.FieldCount;
      FFIELD_SMALLINT.DataSet     := Self;
    
      FFIELD_INTEGER              := TIntegerField.Create(AOwner);
      FFIELD_INTEGER.FieldKind    := fkData;
      FFIELD_INTEGER.Origin       := FDN_FIELD_INTEGER;
      FFIELD_INTEGER.fieldName    := FDN_FIELD_INTEGER;
      FFIELD_INTEGER.Name         := Self.Name + FDN_FIELD_INTEGER;
      FFIELD_INTEGER.Index        := Self.FieldCount;
      FFIELD_INTEGER.DataSet      := Self;
    
      FFIELD_BIGINT                 := TLargeintField.Create(AOwner);
      FFIELD_BIGINT.FieldKind       := fkData;
      FFIELD_BIGINT.Origin          := FDN_FIELD_BIGINT;
      FFIELD_BIGINT.fieldName       := FDN_FIELD_BIGINT;
      FFIELD_BIGINT.DisplayLabel    := CPT_FIELD_BIGINT;
      FFIELD_BIGINT.Name            := Self.Name + FDN_FIELD_BIGINT;
      FFIELD_BIGINT.Index           := Self.FieldCount;
      FFIELD_BIGINT.DataSet         := Self;
    
      FFIELD_FLOAT              := TSingleField.Create(AOwner);
      FFIELD_FLOAT.FieldKind    := fkData;
      FFIELD_FLOAT.Origin       := FDN_FIELD_FLOAT;
      FFIELD_FLOAT.fieldName    := FDN_FIELD_FLOAT;
      FFIELD_FLOAT.Name         := Self.Name + FDN_FIELD_FLOAT;
      FFIELD_FLOAT.Index        := Self.FieldCount;
      FFIELD_FLOAT.DataSet      := Self;
    
      FFIELD_DOUBLE_PRECISION             := TFloatField.Create(AOwner);
      FFIELD_DOUBLE_PRECISION.FieldKind   := fkData;
      FFIELD_DOUBLE_PRECISION.Origin      := FDN_FIELD_DOUBLE_PRECISION;
      FFIELD_DOUBLE_PRECISION.fieldName   := FDN_FIELD_DOUBLE_PRECISION;
      FFIELD_DOUBLE_PRECISION.Name        := Self.Name + FDN_FIELD_DOUBLE_PRECISION;
      FFIELD_DOUBLE_PRECISION.Index       := Self.FieldCount;
      FFIELD_DOUBLE_PRECISION.DataSet     := Self;
    
      FFIELD_NUMERIC                := TFMTBCDField.Create(AOwner);
      FFIELD_NUMERIC.FieldKind      := fkData;
      FFIELD_NUMERIC.Origin         := FDN_FIELD_NUMERIC;
      FFIELD_NUMERIC.fieldName      := FDN_FIELD_NUMERIC;
      FFIELD_NUMERIC.DisplayLabel   := CPT_FIELD_NUMERIC;
      FFIELD_NUMERIC.Name           := Self.Name + FDN_FIELD_NUMERIC;
      FFIELD_NUMERIC.Index          := Self.FieldCount;
      FFIELD_NUMERIC.DataSet        := Self;
    
      FFIELD_DECIMAL              := TFMTBCDField.Create(AOwner);
      FFIELD_DECIMAL.FieldKind    := fkData;
      FFIELD_DECIMAL.Origin       := FDN_FIELD_DECIMAL;
      FFIELD_DECIMAL.fieldName    := FDN_FIELD_DECIMAL;
      FFIELD_DECIMAL.Name         := Self.Name + FDN_FIELD_DECIMAL;
      FFIELD_DECIMAL.Index        := Self.FieldCount;
      FFIELD_DECIMAL.DataSet      := Self;
    
      FFIELD_DATE             := TDateField.Create(AOwner);
      FFIELD_DATE.FieldKind   := fkData;
      FFIELD_DATE.Origin      := FDN_FIELD_DATE;
      FFIELD_DATE.fieldName   := FDN_FIELD_DATE;
      FFIELD_DATE.Name        := Self.Name + FDN_FIELD_DATE;
      FFIELD_DATE.Index       := Self.FieldCount;
      FFIELD_DATE.DataSet     := Self;
    
      FFIELD_TIME             := TTimeField.Create(AOwner);
      FFIELD_TIME.FieldKind   := fkData;
      FFIELD_TIME.Origin      := FDN_FIELD_TIME;
      FFIELD_TIME.fieldName   := FDN_FIELD_TIME;
      FFIELD_TIME.Name        := Self.Name + FDN_FIELD_TIME;
      FFIELD_TIME.Index       := Self.FieldCount;
      FFIELD_TIME.DataSet     := Self;
    
      FFIELD_TIMESTAMP              := TSQLTimeStampField.Create(AOwner);
      FFIELD_TIMESTAMP.FieldKind    := fkData;
      FFIELD_TIMESTAMP.Origin       := FDN_FIELD_TIMESTAMP;
      FFIELD_TIMESTAMP.fieldName    := FDN_FIELD_TIMESTAMP;
      FFIELD_TIMESTAMP.Name         := Self.Name + FDN_FIELD_TIMESTAMP;
      FFIELD_TIMESTAMP.Index        := Self.FieldCount;
      FFIELD_TIMESTAMP.DataSet      := Self;
    
      FFIELD_CHAR             := TStringField.Create(AOwner);
      FFIELD_CHAR.FieldKind   := fkData;
      FFIELD_CHAR.Origin      := FDN_FIELD_CHAR;
      FFIELD_CHAR.fieldName   := FDN_FIELD_CHAR;
      FFIELD_CHAR.Name        := Self.Name + FDN_FIELD_CHAR;
      FFIELD_CHAR.Index       := Self.FieldCount;
      FFIELD_CHAR.DataSet     := Self;
    
      FFIELD_VARCHAR              := TStringField.Create(AOwner);
      FFIELD_VARCHAR.FieldKind    := fkData;
      FFIELD_VARCHAR.Origin       := FDN_FIELD_VARCHAR;
      FFIELD_VARCHAR.fieldName    := FDN_FIELD_VARCHAR;
      FFIELD_VARCHAR.Name         := Self.Name + FDN_FIELD_VARCHAR;
      FFIELD_VARCHAR.Index        := Self.FieldCount;
      FFIELD_VARCHAR.DataSet      := Self;
    
      FFIELD_BLOB                := TMemoField.Create(AOwner);
      FFIELD_BLOB.FieldKind      := fkData;
      FFIELD_BLOB.Origin         := FDN_FIELD_BLOB;
      FFIELD_BLOB.fieldName      := FDN_FIELD_BLOB;
      FFIELD_BLOB.Name           := Self.Name + FDN_FIELD_BLOB;
      FFIELD_BLOB.Index          := Self.FieldCount;
      FFIELD_BLOB.DataSet        := Self;
    
      ConfigureFields;
    
    end;
    
    procedure TFDQueryTypeCode.ConfigureFields;
    begin
      //Configurações específicas para cada Campo
      if FindField(FDN_FIELD_SMALLINT) <> nil then
      begin
        With TSmallintField(FieldByName(FDN_FIELD_SMALLINT)) do
        begin
          DisplayLabel  := CPT_FIELD_SMALLINT;
          DisplayWidth  := 24;
          ProviderFlags := [pfInUpdate];
          Required      := False;
          ReadOnly      := False;
          Visible       := True;
        end;
      end;
    
      if FindField(FDN_FIELD_INTEGER) <> nil then
      begin
        With TIntegerField(FieldByName(FDN_FIELD_INTEGER)) do
        begin
          DisplayLabel  := CPT_FIELD_INTEGER;
          DisplayWidth  := 23;
          ProviderFlags := [pfInUpdate];
          Required      := False;
          ReadOnly      := False;
          Visible       := True;
        end;
      end;
    
      if FindField(FDN_FIELD_BIGINT) <> nil then
      begin
        With TLargeintField(FieldByName(FDN_FIELD_BIGINT)) do
        begin
          DisplayLabel   := CPT_FIELD_BIGINT;
          DisplayWidth   := 22;
          ProviderFlags  := [pfInUpdate, pfInKey, pfInWhere];
          Required       := False;
          ReadOnly       := False;
          Visible        := True;
        end;
      end;
    
      if FindField(FDN_FIELD_FLOAT) <> nil then
      begin
        With TSingleField(FieldByName(FDN_FIELD_FLOAT)) do
        begin
          DisplayLabel    := CPT_FIELD_FLOAT;
          DisplayWidth    := 21;
          //Size          := 4;
          Precision       := 7;
          ProviderFlags   := [pfInUpdate];
          Required        := False;
          ReadOnly        := False;
          Visible         := True;
        end;
      end;
    
      if FindField(FDN_FIELD_DOUBLE_PRECISION) <> nil then
      begin
        With TFloatField(FieldByName(FDN_FIELD_DOUBLE_PRECISION)) do
        begin
          DisplayLabel    := CPT_FIELD_DOUBLE_PRECISION;
          DisplayWidth    := 32;
          //Size            := 8;
          Precision       := 15;
          ProviderFlags   := [pfInUpdate];
          Required        := False;
          ReadOnly        := False;
          Visible         := True;
        end;
      end;
    
      if FindField(FDN_FIELD_NUMERIC) <> nil then
      begin
        With TFMTBCDField(FieldByName(FDN_FIELD_NUMERIC)) do
        begin
          DisplayLabel    := CPT_FIELD_NUMERIC;
          DisplayWidth    := 23;
          //Size            := 8;
          Precision       := 18;
          ProviderFlags   := [pfInUpdate];
          Required        := False;
          ReadOnly        := False;
          Visible         := True;
        end;
      end;
    
      if FindField(FDN_FIELD_DECIMAL) <> nil then
      begin
        With TFMTBCDField(FieldByName(FDN_FIELD_DECIMAL)) do
        begin
          DisplayLabel    := CPT_FIELD_DECIMAL;
          DisplayWidth    := 23;
          //Size            := 6;
          Precision       := 18;
          ProviderFlags   := [pfInUpdate];
          Required        := False;
          ReadOnly        := False;
          Visible         := True;
        end;
      end;
    
      if FindField(FDN_FIELD_DATE) <> nil then
      begin
        With TDateField(FieldByName(FDN_FIELD_DATE)) do
        begin
          DisplayLabel   := CPT_FIELD_DATE;
          DisplayWidth   := 20;
          ProviderFlags  := [pfInUpdate];
          Required       := False;
          ReadOnly       := False;
          Visible        := True;
        end;
      end;
    
      if FindField(FDN_FIELD_TIME) <> nil then
      begin
        With TTimeField(FieldByName(FDN_FIELD_TIME)) do
        begin
          DisplayLabel   := CPT_FIELD_TIME;
          DisplayWidth   := 20;
          ProviderFlags  := [pfInUpdate];
          Required       := False;
          ReadOnly       := False;
          Visible        := True;
        end;
      end;
    
      if FindField(FDN_FIELD_TIMESTAMP) <> nil then
      begin
        With TSQLTimeStampField(FieldByName(FDN_FIELD_TIMESTAMP)) do
        begin
          DisplayLabel   := CPT_FIELD_TIMESTAMP;
          DisplayWidth   := 25;
          ProviderFlags  := [pfInUpdate];
          Required       := False;
          ReadOnly       := False;
          Visible        := True;
        end;
      end;
    
      if FindField(FDN_FIELD_CHAR) <> nil then
      begin
        With TStringField(FieldByName(FDN_FIELD_CHAR)) do
        begin
          DisplayLabel   := CPT_FIELD_CHAR;
          DisplayWidth   := 20;
          Size           := 1;
          ProviderFlags  := [pfInUpdate];
          Required       := False;
          ReadOnly       := False;
          Visible        := True;
        end;
      end;
    
      if FindField(FDN_FIELD_VARCHAR) <> nil then
      begin
        With TStringField(FieldByName(FDN_FIELD_VARCHAR)) do
        begin
          DisplayLabel   := CPT_FIELD_VARCHAR;
          DisplayWidth   := 40;
          Size           := 100;
          ProviderFlags  := [pfInUpdate];
          Required       := False;
          ReadOnly       := False;
          Visible        := True;
        end;
      end;
    
      if FindField(FDN_FIELD_BLOB) <> nil then
      begin
        With TMemoField(FieldByName(FDN_FIELD_BLOB)) do
        begin
          DisplayLabel   := CPT_FIELD_BLOB;
          DisplayWidth   := 20;
          ProviderFlags  := [pfInUpdate];
          Required       := False;
          ReadOnly       := False;
          Visible        := False;
        end;
      end;
    
    end;
    
    procedure TFDQueryTypeCode.DoAfterClose;
    begin
      inherited;
      //Recarregar o Comando SQL Original
      CommandSQL;
    
    end;
    
    procedure TFDQueryTypeCode.DoAfterInsert;
    begin
      inherited;
      //Definir os Valores Padrões dos Campos Obrigatórios
      ValueDefault;
    
    end;
    
    procedure TFDQueryTypeCode.DoBeforeOpen;
    begin
      inherited;
      //Configurar os Campos
      ConfigureFields;
    
    end;
    
    procedure TFDQueryTypeCode.DoBeforePost;
    begin
      inherited;
      //Validar os Campos Obrigatórios
      ValidateFields;
    
    end;
    
    procedure TFDQueryTypeCode.ValidateFields;
    begin 
      inherited; 
      //Testar aqui os Valores Obrigatórios
      if FindField(FDN_FIELD_SMALLINT) <> nil then
        if FieldByName(FDN_FIELD_SMALLINT).IsNull then
          FieldByName(FDN_FIELD_SMALLINT).AsInteger  := 0;
     
      if FindField(FDN_FIELD_INTEGER) <> nil then
        if FieldByName(FDN_FIELD_INTEGER).IsNull then
          FieldByName(FDN_FIELD_INTEGER).AsInteger := 0;
     
      if FindField(FDN_FIELD_BIGINT) <> nil then
        if FieldByName(FDN_FIELD_BIGINT).IsNull then
          FieldByName(FDN_FIELD_BIGINT).AsInteger := 0;
     
      if FindField(FDN_FIELD_FLOAT) <> nil then
        if FieldByName(FDN_FIELD_FLOAT).IsNull then
          FieldByName(FDN_FIELD_FLOAT).AsFloat := 0;
     
      if FindField(FDN_FIELD_DOUBLE_PRECISION) <> nil then
        if FieldByName(FDN_FIELD_DOUBLE_PRECISION).IsNull then
          FieldByName(FDN_FIELD_DOUBLE_PRECISION).AsCurrency := 0;
     
      if FindField(FDN_FIELD_NUMERIC) <> nil then
        if FieldByName(FDN_FIELD_NUMERIC).IsNull then
          FieldByName(FDN_FIELD_NUMERIC).AsInteger := 0;
    
      if FindField(FDN_FIELD_DECIMAL) <> nil then
        if FieldByName(FDN_FIELD_DECIMAL).IsNull then
          FieldByName(FDN_FIELD_DECIMAL).AsInteger := 0;
     
    end; 
     
    procedure TFDQueryTypeCode.ValueDefault;
    begin 
      inherited; 
      //Inicializar aqui os Campos Obrigatórios
      if FindField(FDN_FIELD_DATE) <> nil then
        FieldByName(FDN_FIELD_DATE).AsDateTime := Date;
    
      if FindField(FDN_FIELD_TIME) <> nil then
        FieldByName(FDN_FIELD_TIME).AsDateTime := Time;
    
      if FindField(FDN_FIELD_TIMESTAMP) <> nil then
        FieldByName(FDN_FIELD_TIMESTAMP).AsDateTime := Now;
    
    end;
    
    end.

     

  3. Pra ajudar quem se interessou a fazer sua classe, esta aqui o comando SQL para Firebird:

    Só uma observação, o Nome da Tabela tem que ser exatamente igual ao que esta no banco respeitando palavras Maiúsculas / Minúsculas!

    😉

     

    SELECT SUBSTRING(A.RDB$FIELD_NAME FROM 1 FOR 4) AS MINEMONICO
          ,A.RDB$RELATION_NAME AS TABELA
          ,REPLACE(A.RDB$RELATION_NAME, '_', ' ') AS TABELA_TITULO
          ,CAST(E.RDB$DESCRIPTION AS VARCHAR(5000)) AS TABELA_DESCRICAO
          ,A.RDB$FIELD_NAME AS CAMPO
          ,A.RDB$FIELD_POSITION +1 AS POSICAO
          ,REPLACE(A.RDB$FIELD_NAME, '_', ' ') AS CAMPO_TITULO
          ,CAST(A.RDB$DESCRIPTION AS VARCHAR(5000)) AS CAMPO_DESCRICAO
          ,0 AS VISIVEL -- 0 - Não; 1 - Sim
          ,0 AS SOMENTE_LEITURA -- 0 - Não; 1 - Sim
          ,B.RDB$FIELD_TYPE AS CODIGO_TIPO
          ,CASE WHEN B.RDB$FIELD_TYPE = 007 THEN 'SMALLINT' 
                WHEN B.RDB$FIELD_TYPE = 008 THEN 'INTEGER' 
                WHEN B.RDB$FIELD_TYPE = 010 THEN 'FLOAT' 
                WHEN B.RDB$FIELD_TYPE = 012 THEN 'DATE' 
                WHEN B.RDB$FIELD_TYPE = 013 THEN 'TIME' 
                WHEN B.RDB$FIELD_TYPE = 014 THEN 'CHAR' 
                WHEN B.RDB$FIELD_TYPE = 016 THEN 'BIGINT' 
                WHEN B.RDB$FIELD_TYPE = 027 THEN 'DOUBLE PRECISION' 
                WHEN B.RDB$FIELD_TYPE = 035 THEN 'TIMESTAMP' 
                WHEN B.RDB$FIELD_TYPE = 037 THEN 'VARCHAR' 
                WHEN B.RDB$FIELD_TYPE = 261 THEN 'BLOB' 
                ELSE 'UNKNOWN' 
           END AS TIPO
          ,D.TIPO_CHAVE AS TIPO_CHAVE
          ,B.RDB$FIELD_LENGTH AS TAMANHO
          ,COALESCE(B.RDB$FIELD_PRECISION, 0)  AS PRECISAO
          ,COALESCE(B.RDB$FIELD_SCALE, 0) AS CASAS_DECIMAIS
          ,REPLACE(CAST(A.RDB$DEFAULT_SOURCE AS VARCHAR(100)), 'DEFAULT ', '') AS VALOR_PADRAO
          ,CASE WHEN A.RDB$NULL_FLAG = 1 THEN 1 ELSE 0 END AS OBRIGATORIO -- 0 - Não; 1 - Sim
          ,0  AS DINHEIRO -- 0 - Não; 1 - Sim
          ,'                                                   ' AS MASCARA
          ,D.UNICO AS UNICO -- 0 - Sim
      FROM RDB$RELATION_FIELDS A 
     INNER JOIN RDB$FIELDS B ON B.RDB$FIELD_NAME = A.RDB$FIELD_SOURCE 
     INNER JOIN RDB$TYPES C ON C.RDB$TYPE = B.RDB$FIELD_TYPE AND C.RDB$FIELD_NAME = 'RDB$FIELD_TYPE' 
     INNER JOIN RDB$RELATIONS E ON A.RDB$RELATION_NAME = E.RDB$RELATION_NAME 
     
     LEFT JOIN (SELECT DISTINCT(RDB$INDEX_SEGMENTS.RDB$FIELD_NAME)  AS CAMPO_CHAVE, 
                       CASE WHEN (RDB$RELATION_CONSTRAINTS.RDB$CONSTRAINT_TYPE = 'PRIMARY KEY') THEN 'PRIMARY KEY' 
                            WHEN (RDB$RELATION_CONSTRAINTS.RDB$CONSTRAINT_TYPE = 'FOREIGN KEY') THEN 'FOREIGN KEY' 
                            WHEN (RDB$RELATION_CONSTRAINTS.RDB$CONSTRAINT_TYPE = 'UNIQUE') THEN 'UNIQUE' 
                            ELSE '' 
                       END AS TIPO_CHAVE, 
                       CASE WHEN (RDB$RELATION_CONSTRAINTS.RDB$CONSTRAINT_TYPE = 'UNIQUE') THEN 1 ELSE 0 END AS UNICO, 
                       RDB$RELATION_CONSTRAINTS.RDB$RELATION_NAME   AS TABELA 
                  FROM RDB$RELATION_CONSTRAINTS, 
                       RDB$INDICES, 
                       RDB$INDEX_SEGMENTS 
                 WHERE RDB$RELATION_CONSTRAINTS.RDB$INDEX_NAME = RDB$INDICES.RDB$INDEX_NAME 
                   AND RDB$INDEX_SEGMENTS.RDB$INDEX_NAME = RDB$INDICES.RDB$INDEX_NAME) D ON D.TABELA = A.RDB$RELATION_NAME AND D.CAMPO_CHAVE = A.RDB$FIELD_NAME 
     
     WHERE A.RDB$RELATION_NAME = :NOME_TABELA 
     ORDER BY 6 --RDB$FIELD_POSITION 

     

    Para facilitar as Pesquisas:
     

    {---------------------------------------------------------}
    {  Autor: Fabrício Melo                                   }
    {  e-Mail: [email protected]                               }
    {  skype: fabricio_ftm                                    }
    {  Desenvolvedor Delphi                                   }
    {                                                         }
    {  Componente derivado da TFDQuery, exemplo de como       }
    { escrever uma Tabela e configurar seus campos sem a      }
    { necessidade de usar o Fields Editor do DataSet.         }
    { O Trablho esta em Criar um executável que conecte no    }
    { Banco de Dados e depois modifique essa classe para as   }
    { informaçoes da Tabela desejada, linha a linha. ;)       }
    {---------------------------------------------------------}
    unit UTypeCode;
    
    interface 
     
    uses 
      Classes, DB, SysUtils, MaskUtils, Math, DateUtils,
      FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Param,
      FireDAC.Stan.Error, FireDAC.DatS, FireDAC.Phys.Intf,
      FireDAC.DApt.Intf, FireDAC.Stan.Async, FireDAC.DApt,
      FireDAC.Comp.DataSet, FireDAC.Comp.Client;
     
    const
      //Identificação da Tabela
      TBL_FIELD = 'DATA_TYPE_CODE';
      //Generators
      GEN_FIELD = 'GEN_FIELD_ID';
      //Campos da Tabela
      FDN_FIELD_SMALLINT = 'FIELD_SMALLINT';
      FDN_FIELD_INTEGER = 'FIELD_INTEGER';
      FDN_FIELD_BIGINT = 'FIELD_BIGINT';
      FDN_FIELD_FLOAT = 'FIELD_FLOAT';
      FDN_FIELD_DOUBLE_PRECISION = 'FIELD_DOUBLE_PRECISION';
      FDN_FIELD_NUMERIC = 'FIELD_NUMERIC';
      FDN_FIELD_DECIMAL = 'FIELD_DECIMAL';
      FDN_FIELD_DATE = 'FIELD_DATE';
      FDN_FIELD_TIME = 'FIELD_TIME';
      FDN_FIELD_TIMESTAMP = 'FIELD_TIMESTAMP';
      FDN_FIELD_CHAR = 'FIELD_CHAR';
      FDN_FIELD_VARCHAR = 'FIELD_VARCHAR';
      FDN_FIELD_BLOB = 'FIELD_BLOB';
      //Título dos Campos da Tabela
      CPT_FIELD_SMALLINT = 'Field Smallint';
      CPT_FIELD_INTEGER = 'Field Integer';
      CPT_FIELD_BIGINT = 'Field Bigint';
      CPT_FIELD_FLOAT = 'Field Float';
      CPT_FIELD_DOUBLE_PRECISION = 'Field Double Precision';
      CPT_FIELD_NUMERIC = 'Field Numeric';
      CPT_FIELD_DECIMAL = 'Field Decimal';
      CPT_FIELD_DATE = 'Field Date';
      CPT_FIELD_TIME = 'Field Time';
      CPT_FIELD_TIMESTAMP = 'Field Timestamp';
      CPT_FIELD_CHAR = 'Field Char';
      CPT_FIELD_VARCHAR = 'Field Varchar';
      CPT_FIELD_BLOB = 'Field Blob';
    
    type
    
     TFDQueryTypeCode = class(TFDQuery)
      private
        //Flag para não recriar os Fields ao Abrir o proprietário
        FActiveFieldsExecute: Boolean;
        //Armazenar o proprietário
        FOwner: TComponent;
    
        FActiveFields: Boolean;
    
        procedure SetActiveFields(const Value: Boolean);
    
      public
        //Criação do Objeto
        constructor Create(AOwner: TComponent); override;
        //Depois de Criado
        procedure AfterConstruction; override;
        //Criar os campos na Query...
        procedure CreateFields(AOwner: TComponent);
        //Validar as informações dos Campos
        procedure ValidateFields;
        //Valores Padrões dos Campos Obrigatórios
        procedure ValueDefault;
        //Comando SQL da Tabela
        procedure CommandSQL;
    
      protected
        //Antes de Gravar
        procedure DoBeforePost; override;
        //Inicializar Campos
        procedure DoAfterInsert; override;
        //Recarregar o Comando SQL Original
        procedure DoAfterClose; override;
    
      published
        //Criar os Campos
        property ActiveFields: Boolean read FActiveFields write SetActiveFields default False;
    
     end;
    
    procedure Register;
    
    implementation
    
    { TFDTaTypeCode }
    
    procedure Register;
    begin
      //Paleta de Ferramentas
      RegisterComponents('Minha Paleta Delphi', [ TFDQueryTypeCode ]);
     
    end;
    
    constructor TFDQueryTypeCode.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
    
      //Armazenar o Form ou DM Proprietário
      FOwner                         := AOwner;
      //Aplicar as Configurações desejadas na Query
      UpdateOptions.GeneratorName    := GEN_FIELD;
      UpdateOptions.UpdateTableName  := TBL_FIELD;
      UpdateOptions.KeyFields        := FDN_FIELD_SMALLINT;
      UpdateOptions.AssignedValues   := [uvGeneratorName];
      CachedUpdates                  := True;
      AggregatesActive               := True;
    
      FActiveFieldsExecute           := False;
    
    end; 
     
    procedure TFDQueryTypeCode.AfterConstruction;
    begin 
      inherited;
      //Carregar o Comando SQL
      CommandSQL; 
     
    end; 
     
    procedure TFDQueryTypeCode.CommandSQL;
    {-- Tabela Exemplo - Firebird
      CREATE TABLE DATA_TYPE_CODE (
        FIELD_SMALLINT          SMALLINT,
        FIELD_INTEGER           INTEGER,
        FIELD_BIGINT            BIGINT,
        FIELD_FLOAT             FLOAT,
        FIELD_DOUBLE_PRECISION  DOUBLE PRECISION,
        FIELD_NUMERIC           NUMERIC(16,8),
        FIELD_DECIMAL           DECIMAL(18,6),
        FIELD_DATE              DATE,
        FIELD_TIME              TIME,
        FIELD_TIMESTAMP         TIMESTAMP,
        FIELD_CHAR              CHAR(1),
        FIELD_VARCHAR           VARCHAR(100),
        FIELD_BLOB              BLOB SUB_TYPE 1 SEGMENT SIZE 1024);
    }
    begin 
      inherited; 
    
      SQL.Add('SELECT '); 
      SQL.Add('       FIELD.FIELD_SMALLINT ');
      SQL.Add('      ,FIELD.FIELD_INTEGER ');
      SQL.Add('      ,FIELD.FIELD_BIGINT ');
      SQL.Add('      ,FIELD.FIELD_FLOAT ');
      SQL.Add('      ,FIELD.FIELD_DOUBLE_PRECISION ');
      SQL.Add('      ,FIELD.FIELD_NUMERIC ');
      SQL.Add('      ,FIELD.FIELD_DECIMAL ');
      SQL.Add('      ,FIELD.FIELD_DATE ');
      SQL.Add('      ,FIELD.FIELD_TIME ');
      SQL.Add('      ,FIELD.FIELD_TIMESTAMP ');
      SQL.Add('      ,FIELD.FIELD_CHAR ');
      SQL.Add('      ,FIELD.FIELD_VARCHAR ');
      SQL.Add('      ,FIELD.FIELD_BLOB ');
      SQL.Add('  FROM DATA_TYPE_CODE FIELD ');
      SQL.Add(' WHERE (1=1) ');
    
      {Para usar no form:
        Query.Close;
        Query.SQL.Add(' AND FIELD_SMALLINT = 1982 ');
        Query.Open;
      }
    end; 
    
    procedure TFDQueryTypeCode.SetActiveFields(const Value: Boolean);
    begin
    
      FActiveFields := Value;
      //Flag pra controlar no Create do Proprietário
      if FActiveFieldsExecute then
        if FOwner <> nil then
          //Criando os Campos no DataSet em Desenvolvimento
          if ( csDesigning in Self.ComponentState ) then
          begin
            //Remove do DataSet e do Proprietário
            if Self.FieldCount > 0 then
              Self.Fields.Clear;
            //Criar os Campos Novamente no DataSet e no Proprietário
            if FActiveFields then
              CreateFields(FOwner);
          end;
    
      FActiveFieldsExecute := True;
    
    end;
    
    procedure TFDQueryTypeCode.CreateFields(AOwner: TComponent);
    var
      FIELD_SMALLINT: TSmallintField;
      FIELD_INTEGER: TIntegerField;
      FIELD_BIGINT: TLargeintField;
      FIELD_FLOAT: TSingleField;
      FIELD_DOUBLE_PRECISION: TFloatField;
      FIELD_NUMERIC: TFMTBCDField;
      FIELD_DECIMAL: TFMTBCDField;
      FIELD_DATE: TDateField;
      FIELD_TIME: TTimeField;
      FIELD_TIMESTAMP: TSQLTimeStampField;
      FIELD_CHAR: TStringField;
      FIELD_VARCHAR: TStringField;
      FIELD_BLOB: TMemoField;
      FieldDef: TFieldDef;
    begin
      //Tipos Comuns do Firebird
      FIELD_SMALLINT                := TSmallintField.Create(AOwner);
      FIELD_SMALLINT.FieldKind      := fkData;
      FIELD_SMALLINT.Origin         := FDN_FIELD_SMALLINT;
      FIELD_SMALLINT.fieldName      := FDN_FIELD_SMALLINT;
      FIELD_SMALLINT.DisplayLabel   := CPT_FIELD_SMALLINT;
      FIELD_SMALLINT.DisplayWidth   := 24;
      FIELD_SMALLINT.ProviderFlags  := [pfInUpdate];
      FIELD_SMALLINT.Required       := False;
      FIELD_SMALLINT.ReadOnly       := False;
      FIELD_SMALLINT.Visible        := True;
      FIELD_SMALLINT.Name           := Self.Name + FDN_FIELD_SMALLINT;
      FIELD_SMALLINT.Index          := Self.FieldCount;
      FIELD_SMALLINT.DataSet        := Self;
    
      FIELD_INTEGER                := TIntegerField.Create(AOwner);
      FIELD_INTEGER.FieldKind      := fkData;
      FIELD_INTEGER.Origin         := FDN_FIELD_INTEGER;
      FIELD_INTEGER.fieldName      := FDN_FIELD_INTEGER;
      FIELD_INTEGER.DisplayLabel   := CPT_FIELD_INTEGER;
      FIELD_INTEGER.DisplayWidth   := 23;
      FIELD_INTEGER.ProviderFlags  := [pfInUpdate];
      FIELD_INTEGER.Required       := False;
      FIELD_INTEGER.ReadOnly       := False;
      FIELD_INTEGER.Visible        := True;
      FIELD_INTEGER.Name           := Self.Name + FDN_FIELD_INTEGER;
      FIELD_INTEGER.Index          := Self.FieldCount;
      FIELD_INTEGER.DataSet        := Self; 
     
      FIELD_BIGINT                := TLargeintField.Create(AOwner);
      FIELD_BIGINT.FieldKind      := fkData; 
      FIELD_BIGINT.Origin         := FDN_FIELD_BIGINT;
      FIELD_BIGINT.fieldName      := FDN_FIELD_BIGINT;
      FIELD_BIGINT.DisplayLabel   := CPT_FIELD_BIGINT; 
      FIELD_BIGINT.DisplayWidth   := 22; 
      FIELD_BIGINT.ProviderFlags  := [pfInUpdate]; 
      FIELD_BIGINT.Required       := False; 
      FIELD_BIGINT.ReadOnly       := False; 
      FIELD_BIGINT.Visible        := True; 
      FIELD_BIGINT.Name           := Self.Name + FDN_FIELD_BIGINT;
      FIELD_BIGINT.Index          := Self.FieldCount; 
      FIELD_BIGINT.DataSet        := Self; 
     
      FIELD_FLOAT                := TSingleField.Create(AOwner);
      FIELD_FLOAT.FieldKind      := fkData; 
      FIELD_FLOAT.Origin         := FDN_FIELD_FLOAT;
      FIELD_FLOAT.fieldName      := FDN_FIELD_FLOAT;
      FIELD_FLOAT.DisplayLabel   := CPT_FIELD_FLOAT; 
      FIELD_FLOAT.DisplayWidth   := 21; 
      //FIELD_FLOAT.Size           := 4;
      FIELD_FLOAT.Precision      := 7;
      FIELD_FLOAT.ProviderFlags  := [pfInUpdate]; 
      FIELD_FLOAT.Required       := False; 
      FIELD_FLOAT.ReadOnly       := False; 
      FIELD_FLOAT.Visible        := True; 
      FIELD_FLOAT.Name           := Self.Name + FDN_FIELD_FLOAT;
      FIELD_FLOAT.Index          := Self.FieldCount; 
      FIELD_FLOAT.DataSet        := Self; 
     
      FIELD_DOUBLE_PRECISION                := TFloatField.Create(AOwner);
      FIELD_DOUBLE_PRECISION.FieldKind      := fkData; 
      FIELD_DOUBLE_PRECISION.Origin         := FDN_FIELD_DOUBLE_PRECISION;
      FIELD_DOUBLE_PRECISION.fieldName      := FDN_FIELD_DOUBLE_PRECISION;
      FIELD_DOUBLE_PRECISION.DisplayLabel   := CPT_FIELD_DOUBLE_PRECISION; 
      FIELD_DOUBLE_PRECISION.DisplayWidth   := 32; 
      //FIELD_DOUBLE_PRECISION.Size           := 8;
      FIELD_DOUBLE_PRECISION.Precision      := 15;
      FIELD_DOUBLE_PRECISION.ProviderFlags  := [pfInUpdate]; 
      FIELD_DOUBLE_PRECISION.Required       := False; 
      FIELD_DOUBLE_PRECISION.ReadOnly       := False; 
      FIELD_DOUBLE_PRECISION.Visible        := True; 
      FIELD_DOUBLE_PRECISION.Name           := Self.Name + FDN_FIELD_DOUBLE_PRECISION;
      FIELD_DOUBLE_PRECISION.Index          := Self.FieldCount; 
      FIELD_DOUBLE_PRECISION.DataSet        := Self; 
     
      FIELD_NUMERIC                    := TFMTBCDField.Create(AOwner);
      FIELD_NUMERIC.FieldKind          := fkData;
      FIELD_NUMERIC.Origin             := FDN_FIELD_NUMERIC;
      FIELD_NUMERIC.fieldName          := FDN_FIELD_NUMERIC;
      FIELD_NUMERIC.DisplayLabel       := CPT_FIELD_NUMERIC;
      FIELD_NUMERIC.DisplayWidth       := 23;
      //FIELD_DOUBLE_PRECISION.Size      := 8;
      FIELD_DOUBLE_PRECISION.Precision := 18;
      FIELD_NUMERIC.ProviderFlags      := [pfInUpdate];
      FIELD_NUMERIC.Required           := False;
      FIELD_NUMERIC.ReadOnly           := False;
      FIELD_NUMERIC.Visible            := True;
      FIELD_NUMERIC.Name               := Self.Name + FDN_FIELD_NUMERIC;
      FIELD_NUMERIC.Index              := Self.FieldCount;
      FIELD_NUMERIC.DataSet            := Self;
     
      FIELD_DECIMAL                    := TFMTBCDField.Create(AOwner);
      FIELD_DECIMAL.FieldKind          := fkData;
      FIELD_DECIMAL.Origin             := FDN_FIELD_DECIMAL;
      FIELD_DECIMAL.fieldName          := FDN_FIELD_DECIMAL;
      FIELD_DECIMAL.DisplayLabel       := CPT_FIELD_DECIMAL;
      FIELD_DECIMAL.DisplayWidth       := 23;
      //FIELD_DOUBLE_PRECISION.Size      := 6;
      FIELD_DOUBLE_PRECISION.Precision := 18;
      FIELD_DECIMAL.ProviderFlags      := [pfInUpdate];
      FIELD_DECIMAL.Required           := False;
      FIELD_DECIMAL.ReadOnly           := False;
      FIELD_DECIMAL.Visible            := True;
      FIELD_DECIMAL.Name               := Self.Name + FDN_FIELD_DECIMAL;
      FIELD_DECIMAL.Index              := Self.FieldCount;
      FIELD_DECIMAL.DataSet            := Self;
     
      FIELD_DATE                := TDateField.Create(AOwner);
      FIELD_DATE.FieldKind      := fkData; 
      FIELD_DATE.Origin         := FDN_FIELD_DATE;
      FIELD_DATE.fieldName      := FDN_FIELD_DATE;
      FIELD_DATE.DisplayLabel   := CPT_FIELD_DATE; 
      FIELD_DATE.DisplayWidth   := 20; 
      FIELD_DATE.ProviderFlags  := [pfInUpdate]; 
      FIELD_DATE.Required       := False; 
      FIELD_DATE.ReadOnly       := False; 
      FIELD_DATE.Visible        := True; 
      FIELD_DATE.Name           := Self.Name + FDN_FIELD_DATE;
      FIELD_DATE.Index          := Self.FieldCount; 
      FIELD_DATE.DataSet        := Self; 
     
      FIELD_TIME                := TTimeField.Create(AOwner);
      FIELD_TIME.FieldKind      := fkData; 
      FIELD_TIME.Origin         := FDN_FIELD_TIME;
      FIELD_TIME.fieldName      := FDN_FIELD_TIME;
      FIELD_TIME.DisplayLabel   := CPT_FIELD_TIME; 
      FIELD_TIME.DisplayWidth   := 20; 
      FIELD_TIME.ProviderFlags  := [pfInUpdate]; 
      FIELD_TIME.Required       := False; 
      FIELD_TIME.ReadOnly       := False; 
      FIELD_TIME.Visible        := True; 
      FIELD_TIME.Name           := Self.Name + FDN_FIELD_TIME;
      FIELD_TIME.Index          := Self.FieldCount; 
      FIELD_TIME.DataSet        := Self; 
     
      FIELD_TIMESTAMP                := TSQLTimeStampField.Create(AOwner);
      FIELD_TIMESTAMP.FieldKind      := fkData; 
      FIELD_TIMESTAMP.Origin         := FDN_FIELD_TIMESTAMP;
      FIELD_TIMESTAMP.fieldName      := FDN_FIELD_TIMESTAMP;
      FIELD_TIMESTAMP.DisplayLabel   := CPT_FIELD_TIMESTAMP; 
      FIELD_TIMESTAMP.DisplayWidth   := 25; 
      FIELD_TIMESTAMP.ProviderFlags  := [pfInUpdate]; 
      FIELD_TIMESTAMP.Required       := False; 
      FIELD_TIMESTAMP.ReadOnly       := False; 
      FIELD_TIMESTAMP.Visible        := True; 
      FIELD_TIMESTAMP.Name           := Self.Name + FDN_FIELD_TIMESTAMP;
      FIELD_TIMESTAMP.Index          := Self.FieldCount; 
      FIELD_TIMESTAMP.DataSet        := Self; 
     
      FIELD_CHAR                := TStringField.Create(AOwner);
      FIELD_CHAR.FieldKind      := fkData; 
      FIELD_CHAR.Origin         := FDN_FIELD_CHAR;
      FIELD_CHAR.fieldName      := FDN_FIELD_CHAR;
      FIELD_CHAR.DisplayLabel   := CPT_FIELD_CHAR; 
      FIELD_CHAR.DisplayWidth   := 20; 
      FIELD_CHAR.Size           := 1; 
      FIELD_CHAR.ProviderFlags  := [pfInUpdate]; 
      FIELD_CHAR.Required       := False; 
      FIELD_CHAR.ReadOnly       := False; 
      FIELD_CHAR.Visible        := True; 
      FIELD_CHAR.Name           := Self.Name + FDN_FIELD_CHAR;
      FIELD_CHAR.Index          := Self.FieldCount; 
      FIELD_CHAR.DataSet        := Self; 
     
      FIELD_VARCHAR                := TStringField.Create(AOwner);
      FIELD_VARCHAR.FieldKind      := fkData; 
      FIELD_VARCHAR.Origin         := FDN_FIELD_VARCHAR;
      FIELD_VARCHAR.fieldName      := FDN_FIELD_VARCHAR;
      FIELD_VARCHAR.DisplayLabel   := CPT_FIELD_VARCHAR; 
      FIELD_VARCHAR.DisplayWidth   := 40; 
      FIELD_VARCHAR.Size           := 100; 
      FIELD_VARCHAR.ProviderFlags  := [pfInUpdate]; 
      FIELD_VARCHAR.Required       := False; 
      FIELD_VARCHAR.ReadOnly       := False; 
      FIELD_VARCHAR.Visible        := True; 
      FIELD_VARCHAR.Name           := Self.Name + FDN_FIELD_VARCHAR;
      FIELD_VARCHAR.Index          := Self.FieldCount; 
      FIELD_VARCHAR.DataSet        := Self; 
     
      FIELD_BLOB                := TMemoField.Create(AOwner);
      FIELD_BLOB.FieldKind      := fkData; 
      FIELD_BLOB.Origin         := FDN_FIELD_BLOB;
      FIELD_BLOB.fieldName      := FDN_FIELD_BLOB;
      FIELD_BLOB.DisplayLabel   := CPT_FIELD_BLOB; 
      FIELD_BLOB.DisplayWidth   := 20; 
      FIELD_BLOB.ProviderFlags  := [pfInUpdate]; 
      FIELD_BLOB.Required       := False; 
      FIELD_BLOB.ReadOnly       := False; 
      FIELD_BLOB.Visible        := False; 
      FIELD_BLOB.Name           := Self.Name + FDN_FIELD_BLOB;
      FIELD_BLOB.Index          := Self.FieldCount; 
      FIELD_BLOB.DataSet        := Self; 
     
    end; 
    
    procedure TFDQueryTypeCode.DoAfterClose;
    begin
      inherited;
      //Recarregar o Comando SQL Original
      CommandSQL;
    
    end;
    
    procedure TFDQueryTypeCode.DoAfterInsert;
    begin
      inherited;
      //Definir os Valores Padrões dos Campos Obrigatórios
      ValueDefault;
    
    end;
    
    procedure TFDQueryTypeCode.DoBeforePost;
    begin
      inherited;
      //Validar os Campos Obrigatórios
      ValidateFields;
    
    end;
    
    procedure TFDQueryTypeCode.ValidateFields;
    begin 
      inherited; 
      //Testar aqui os Valores Obrigatórios
      if FindField(FDN_FIELD_SMALLINT) <> nil then
        if FieldByName(FDN_FIELD_SMALLINT).IsNull then
          FieldByName(FDN_FIELD_SMALLINT).AsInteger  := 0;
     
      if FindField(FDN_FIELD_INTEGER) <> nil then
        if FieldByName(FDN_FIELD_INTEGER).IsNull then
          FieldByName(FDN_FIELD_INTEGER).AsInteger := 0;
     
      if FindField(FDN_FIELD_BIGINT) <> nil then
        if FieldByName(FDN_FIELD_BIGINT).IsNull then
          FieldByName(FDN_FIELD_BIGINT).AsInteger := 0;
     
      if FindField(FDN_FIELD_FLOAT) <> nil then
        if FieldByName(FDN_FIELD_FLOAT).IsNull then
          FieldByName(FDN_FIELD_FLOAT).AsFloat := 0;
     
      if FindField(FDN_FIELD_DOUBLE_PRECISION) <> nil then
        if FieldByName(FDN_FIELD_DOUBLE_PRECISION).IsNull then
          FieldByName(FDN_FIELD_DOUBLE_PRECISION).AsCurrency := 0;
     
      if FindField(FDN_FIELD_NUMERIC) <> nil then
        if FieldByName(FDN_FIELD_NUMERIC).IsNull then
          FieldByName(FDN_FIELD_NUMERIC).AsInteger := 0;
     
      if FindField(FDN_FIELD_DECIMAL) <> nil then
        if FieldByName(FDN_FIELD_DECIMAL).IsNull then
          FieldByName(FDN_FIELD_DECIMAL).AsInteger := 0;
     
    end; 
     
    procedure TFDQueryTypeCode.ValueDefault;
    begin 
      inherited; 
      //Inicializar aqui os Campos Obrigatórios
      if FindField(FDN_FIELD_DATE) <> nil then
        FieldByName(FDN_FIELD_DATE).AsDateTime := Date;
    
      if FindField(FDN_FIELD_TIME) <> nil then
        FieldByName(FDN_FIELD_TIME).AsDateTime := Time;
    
      if FindField(FDN_FIELD_TIMESTAMP) <> nil then
        FieldByName(FDN_FIELD_TIMESTAMP).AsDateTime := Now;
    
    end;
    
    end.

     

  4. Boa noite.
    Eu consegui resolver fazendo um "miau".
    Depois de horas tentando fazer igual ao Fields Editor do Delphi eu percebi que não precisava  de nada disso,  o meu único problema era que, como eu crie uma propriedade que cria os Fields da minha classe e os configurava na query, ao abrir meu DM o componente é criado juntamente com suas propriedades, como eu coloquei no método "SET" da propriedade "ActiveFields" as funções que executavam a criação e as configurações dos Fields, dava o erro...
    Resolvi criando uma variável que eu inicializo no create da classe pra não deixar executar novamente a criação dos Fields existente ao passar pela propriedade...
    Mas nem tudo é perfeito, ao colocar uma classe no DM, eu só consigo criar os Fields na segunda tentativa, ou seja, tenho que ativa, desativar e ativar de novo pra que a propriedade funcione e crie os Fields, depois disso funciona 100%, porem não dá mais o erro na tela!
    Mais ainda aguardo sugestões, pois pra mim ainda não ficou bom...

    😜

    UTypeCode.pas

    • Curtir 1
  5. Boa noite.
    Eu tentei validar se existem sim, mas não acertei o ponto, nem consegui descobrir como o Delphi faz no Fields Editor, até vasculhei o código por dias, o problema é que sempre que abro o Form proprietário a Query tenta recriar esses campos, é como se eles não estivessem registrados pra ela... 
    O Field ao ser criado ele recebe o proprietário da Query como seu proprietário, isso faz com que ele apareça no DM ou Form, mas pra aparecer no Fields Editor eu seto somente .DataSet := Self, assim ele aparece la, creio eu, mas acredito que tenha mas algum detalhe, pois a Query não o reconhece em desenvolvimento...
    Se eu descobrir esse ponto vai ficar muito legal montar uma query sem ter que configurar os Fields no Fields Editor do DataSet um por um...

    😥

  6. Bom dia.
    Querendo agilizar o desenvolvimento, resolvi criar um gerador de Querys baseado na classe do FDQuery da Biblioteca do FireDac.
    O meu gerador conecta na Tabela do banco de Dados e gera uma classe dessa tabela configurada para o uso no sistema, acho que é simples assim...
    Do jeito que desenhei funciona muito bem, assim defino no meu gerador os Títulos dos campos e suas configurações, tudo em um lugar só...
    Pra mim ficou muito bom, mas, nem sempre a facilidade vem acompanhada de maravilhas, o meu componente funciona do jeito que eu queria, gero as classe de minhas tabelas e aplico nos formulários já configurada e sem problema algum na manutenção de dados na hora da execução, mas, em  desenvolvimento, estou com um errinho chato...

    image.png.8b263097bef56888c6d531e0f3428144.png

    Todas as vezes que abro meu Data Modulo eu me deparo com esse erro para todos os campos da minha query, ai tenho que ignorar tudo e a vida continua, não afeta a aplicação, mas toda vez tenho que fazer isso ao entrar em algum formulário...
    Então, o que eu quero e uma ajuda, pois não descobri como fazer com que a Query identifique que esses campos já existem nela ao abrir o DM...
    Achei muitos exemplos na internet, mas que precisam dar close/open no componente pra adicionar cada campo, acredito eu, que deva ter um jeito mais simples, só não achei onde encaixar esses fields para que a Query o reconheça em Desenvolvimento
    Estou postando o exemplo.
    Grato pela ajuda, se conseguir depois posto o resultado final pra quem se interessar...

    Estou usando banco de dados Firebird 2.5

    CREATE TABLE DATA_TYPE_CODE (
        FIELD_SMALLINT          SMALLINT,
        FIELD_INTEGER           INTEGER,
        FIELD_BIGINT            BIGINT,
        FIELD_FLOAT             FLOAT,
        FIELD_DOUBLE_PRECISION  DOUBLE PRECISION,
        FIELD_NUMERIC           NUMERIC(16,8),
        FIELD_DECIMAL           DECIMAL(18,6),
        FIELD_DATE              DATE,
        FIELD_TIME              TIME,
        FIELD_TIMESTAMP         TIMESTAMP,
        FIELD_CHAR              CHAR(1),
        FIELD_VARCHAR           VARCHAR(100),
        FIELD_BLOB              BLOB SUB_TYPE 1 SEGMENT SIZE 1024
    );

    TESTE_COMPONENTE.rar

  7. Me deparei com esse problema aqui, então não seria conveniente o componente ja carrgar o "nosso número" sem o dígito? pois é um valor gerado para atender o Leaute, ou talvez um campo "nosso numero digito"... ficaria mais fácil pra fazer o retorno em nossas aplicações sem se preocupar com esse dígito por banco...

  8. Bom dia.

    Estou com dúvidas no cálculo de dias úteis do componente ACBr Boleto no seguinte:

    image.png.4c4e7c603bc0965d6169db15ef71393b.png

    O Boleto acima esta configurado para protestar apos o 5º dia util nos parametros do sistema, porem a mensagem vem com o "4º dia", pelo nosso entendimento e do cliente, o protesto deveria ocorrer no 5º dia 02/04 e não no 4º dia 01/02...
    Não entendi porque ele retroagiu um dia sendo que temos um sábado e um domingo dentro desse período pelo cálculo do componente .

    Grato.

     

  9. Reeinstalei as impressoras e tentei de novo, já que deu certo pra você, não deu mais o erro, mas continuo com uma só impressão, teste na impressora virtual e na física, ambas recebem dois comandos, mas umas das linhas sempre somem e fica sá a primeira, é bem rápido... so imprime uma via... seria esse o ponto certo?

     

    image.thumb.png.478871f759d20de6c60a5f45eca2a028.png

    image.thumb.png.a1b461d1b4d7bf44a29330af2c4ed400.png

    image.png.69b4f0a8ee1833fb12d1974b59542c87.png

     

  10. Bom dia, implementei no meu sistema a opção "NumCopias" mas nunca tinha usado, até um cliente querer imprimir mais de uma via do boleto, descobri que a propriedade não funciona.

    Fui na função "TACBrBoletoFCFR.PreparaRelatorio" e inclui a linha "frxReport.PrintOptions.Copies := NumCopias" e passou a dar erro na tentativa de impressão...

    Resolvi fazendo um laço na chamada do AcbrBoleto.Imprimir...

    Então:
    Tem como corrigir essa opção e fazer o Boleto imprimir mais de uma via?
    ou senão
    Tem como tirar a propriedade ja que ela não é usada?

    Não consegui corrigir o erro, então vi que ela não deve esta sendo usada por esse motivo...

    ?

     

  11. Bom dia.

    Eu já tentei de tudo achar uma configuração válida, mas não acertei ainda, permaneço com o erro em alguns momentos, é aleatorio mas continua, tenho que tentar ate 3 vezes pra conseguir um retorno...

    image.png.f24dfa4abac80f2ca6f2dd89b6d4675e.png

    A que mais dá certo pra mim é essa, mas não concordo com ela pois o SSLLib volta pra CUSTOM por conta de usar o xsMsXML e ter que usar o Tipo LT_all, poderiam postar aqui suas configurações?

  12. Bom dia.

    Recentemente meu cliente reclamou de que no DANFe o Campo " modFrete " sai impresso somente "1 - DEST/REM" e que as transportadoras dele estão reclamando, falei que o nosso DANFe obedece as normas técnicas, mas ele não aceitou a resposta, resolvi debugar para ver o que poderia ser feito, vi que na função "modFreteToDesStr()" ja tem essa opção para a versão ve400 "1 - DESTINATARIO", porem estava chegando sempre o mesmo valor "versao = ve200", por isso o DANFe sempre sai com "1 - DEST/REM", fiz a alteração na classe e estou enviando para correção na procedure "CarregaTransportador" na unit ACBrNFeDANFEFRDM.

    procedure TACBrNFeFRClass.CarregaTransportador;
    var
      ok: Boolean;
    begin
      with cdsTransportador do
      begin
        Close;
        CreateDataSet;
        Append;

        with FNFe.Transp do
        begin
          FieldByName('ModFrete').AsString := modFreteToDesStr( modFrete, DblToVersaoDF(ok, FNFe.infNFe.Versao));
          with Transporta do
          begin
            FieldByName('CNPJCPF').AsString := FormatarCNPJouCPF(CNPJCPF);
            FieldByName('XNome').AsString   := XNome;
            FieldByName('IE').AsString      := IE;
            FieldByName('XEnder').AsString  := XEnder;
            FieldByName('XMun').AsString    := CollateBr(XMun);
            FieldByName('UF').AsString      := UF;
          end;
        end;
        Post;
      end;
    end;


    Grato.
     

    ACBrNFeDANFEFRDM.pas

  13. Não recomendo dá muito trabalho, mas ainda é possivel carregar a pagina do SEFAZ Consulta completa em um WebBrowser dentro de sua aplicação, informar a chave de acesso, informar o captcha e carregar a nota, dai em diante vc tem todo o codigo HTML da pagina, se souber trabalhar com ele e só ir montando as informações e alimentar o componente ACBrNFe, mas repito, dá muito trabalho...


    ?

    • Curtir 1
  14. Boa tarde.

    Estou com esse problema também...

    Alguns dos meus clientes usam o NFC-e de uma grande Empresa Nacional ai...

    Esse sistema emite alguns cupons em contingência, normal ate ai, só que por motivo que eu desconheço ele não envia esses cupons depois, ficando os mesmo pendente no SEFAZ...

    Pra não terem que ficar abrindo chamado com essa empresa e aguardar uma eternidade meus clientes em comum, pediram uma solução, assim fizemos, pois temos acesso ao XML gerado, os identifico, carrego para o nosso sistema emissor, problema resolvido, clientes felizes...

    Porem chegou um lote de um desses clientes que esses XML’s foram emitidos em contingência e ao tentar envia-los pela minha aplicação recebemos a critica 464 - Rejeição: Código de Hash no QR-Code difere do calculado...

    Apaguei a TAG do QRCOde e da assinatura, e gerei de novo, sem sucesso, a mesma crítica, de forma alguma o SEFAZ aceita esses XML's alegando essa critica...

    A única coisa que eu posso dizer é que o cliente "cancelou" o CSC e gerou outro, esses XML's agora não validam mais com o novo, é como se o SEFAZ já os tivesse em sua base e soubessem que não é mais o arquivo original.

    O cupom não esta disponível pra consulta pois a chave gerada é em contingência e a UF - TO não tem uma consulta que eu conheço pra ver se ele já esta lá ou não...

    Não sei como resolver esse caso, pois o SEFAZ - TO não recebe se assinar de novo com o novo CSC e não recebe mais o arquivo original sem o CSC ativo no período...

  15. Boa tarde.

    Quero compartilhar com vocês um Form para impressão da Nota Fiscal de Serviço de Goiânia pelo sistema.

    Muitos devem esta usando o Navegador para visualizar e imprimir, então eu resumi isso em um Form.
     

    procedure ImprimirGyn(pXML: string; Visualizar: Boolean);
    var
      NumeroNota: string;
      CodVerificacao: string;
      InscricaoMunicipal: string;
      strLink: string;
      TemImpressoraPadrao: Boolean;
      EscolherImpressora: Boolean;
    const
      URLNFSeGoianiaImpressao   = 'http://www2.goiania.go.gov.br/sistemas/snfse/asp/snfse00200w0.asp?inscricao=<Inscricao_municipal>&nota=<Numero_da_nota>&verificador=<Codigo_de_verificacao>';
    begin
      ACBrNFSe.NotasFiscais.Clear;
    
      ACBrNFSe.NotasFiscais.LoadFromString(pXML);
    
      NumeroNota            := ACBrNFSe.NotasFiscais.Items[0].NFSe.Numero;
      CodVerificacao        := ACBrNFSe.NotasFiscais.Items[0].NFSe.CodigoVerificacao;
      InscricaoMunicipal    := ACBrNFSe.NotasFiscais.Items[0].NFSe.Prestador.InscricaoMunicipal;
    
      strLink               := URLNFSeGoianiaImpressao;
    
      strLink               := StringReplace( strLink, '<Inscricao_municipal>', InscricaoMunicipal, [rfIgnoreCase] );
    
      strLink               := StringReplace( strLink, '<Numero_da_nota>', NumeroNota, [rfIgnoreCase] );
    
      strLink               := StringReplace( strLink, '<Codigo_de_verificacao>', CodVerificacao, [rfIgnoreCase] );
    
      if not(pVisualizar) then
      begin
        TemImpressoraPadrao := ACBrNFSe.DANFSE.Impressora <> '';
        EscolherImpressora  := ACBrNFeDANFECFE.MostraSetup;
      end;
    
      ImprimirLink(strLink, pVisualizar, TemImpressoraPadrao, EscolherImpressora);
    end;

     

    PAS_DFM.zip

    • Curtir 1
  16. Sim, criei um parâmetro na minha aplicação pra esse caso:

    if TIPO_COMUNICACAO_PRINT = '0' then //ACBrNFeDANFeESCPOS
    begin
      ACBrNFe.DANFE := ACBrNFeDANFeESCPOS;
    end else
    begin
      ACBrNFe.DANFE := ACBrNFeDANFE;
      ACBrNFeDANFE.FastFile := PathWithDelim(ExtractFilePath(Application.ExeName))+'Report\DANFeNFCe.fr3';  
    end;
     

  17. Atualização recente, estou usando os componentes originais, protocolo da EPSON, com as mesmas configurações dos DEMOS...
    Pra mim a impressão esta passando de bom, pra um documento que vai ser entregue ao cliente, economiza papel, mas pro meu cliente não, ele quer maior, pra piorar na minha DARUMA e na i9 sai maior e no sistema que nos tiramos de lá também saia maior, "claro que não usava ACBr, por isso tiramos"  :) ..., já testei todos os protocolos, os que não dão erro sai com a fonte pequena e eu não tenho ninguem mais com esse modelo i7 pra comparar pois nos recomendamos sempre a i9 pra não ter dor de cabeça...

  18. Usei o Demo ACBrNFeDANFeEscPos

    Qualquer impressão usando o POSPrinter da certo e sai legível, só o DANFCe que esta saindo com a fonte pequena, não consigo achar a diferença, pois em outras impressoras aqui sai bem maior, inclusive na minha DARUMA que foi pro cliente e na minha i9 que tambem foi pra cliente substituir uma Bematech que essa a fonte já sai e grande de mais e da quebra de linha em tudo, porem a Bematech resolve com o Driver, reinstalando toda vez, essa i7 é so o arquivo específico do DANFCe...

    ACBR_NFE_ELGIN_I7_POS_PRINT_4.thumb.jpeg.424cde3eebbd8e8acda59031e95e08cc.jpeg

×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...