Ir para conteúdo
  • Cadastre-se

dev botao

Proposta de melhorias na unit ACBrNFeDANFeRL.pas


Waldir Paim
  • Este tópico foi criado há 2876 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Moderadores

Fiz alguns ajustes na unit para utilizar TFDMemTable em vez de TClientDataset nas versões mais novas do Delphi.

Para deixar a escolha mais parametrizável poderíamos criar uma diretiva para esse caso e assim não afetaria os projetos que ainda não adotaram o Firedac. 

Segue unit anexo.

ACBrNFeDANFeRL.pas

Editado por Waldir Paim
Link para o comentário
Compartilhar em outros sites

  • Moderadores

Quais as vantagens , @Waldir Paim ?  

  {$IFDEF BORLAND}
    {$IF CompilerVersion > 22}
     FireDAC.Comp.Client,
    {$ELSE}
      DBClient,
    {$IFEND}
  {$ELSE} BufDataset, {$ENDIF} DB;

 

Equipe ACBr Henrique Leonardo
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Tecnólogo em processamento de dados

E-mail [email protected] - Skype : hleorj

Link para o comentário
Compartilhar em outros sites

  • Moderadores

@hleorj

As vantagens são inúmeras.

A mais relevante é não depender mais da midas.dll

Veja os problemas:

Citar

Encontrado 113 registros

  1. ...aMidas ele já tem também. Com relação ao IE, que tipo de configuração você acha? Segurança? Obrigado.
  2. photo-thumb-63.jpg

     NFSe - Erro O sistema não pode encontrar o arquivo especificado

    Italo Jurisato Junior replied to wdorneles's tópico in ACBrNFSe

    ...por exemplo oMidas. Configuração do IE.
  3. ...para quem possa interessar 1 - copiar o arquivomidas.dll para a pasta c:\windows\syswow64; 2 - Acessar o prompt de comando, executar como administrador (acredito que esse seja o X do problema, tem que ser como administrador) e executar o comando regsvr32midas.dll dentro da pasta c:...
  4. 12049644_1082772998483749_29428255086726

    W1029 Duplicate constructor 'EACBrDFeException.CreateDef'

    Ismael Alves replied to Ismael Alves's tópico in ACBrNFe/ACBrNFeMonitor

    ...conforme você falou era mesmo dll o negocio foi descobrir qual dll faltava e era justo aMIDAS.DLL.
  5. f29bd2d145fc88db0603c658e8185dc8?d=http%

     RLNFE erro

    JSantos replied to murilo cosme da silva's tópico in Dúvidas Gerais

    ...mas o que faz estamidas.dll?
  6. paulorsa_pq.jpg.ca65e36d271f4ca724b0e00c

     RLNFE erro

    paulorsa replied to murilo cosme da silva's tópico in Dúvidas Gerais

    Provavelmente seja oMidas.dll, que não foi registrado. Copie ele para a pasta C:\Windows\System32 (32 bits) ou C:\Windows\SysWow64 (64 bits) e registre da seguinte forma pelo prompt de comando. regsvr32midas.dll

E as outras são tão relevante quanto é utilizar a estrutura mais moderna do Firedac.

 

Editado por Waldir Paim
Link para o comentário
Compartilhar em outros sites

  • Moderadores

Bem lembrado .. Poderia verificar a mesma situação na Unit ACBrNFeDANFEFRDM. 

     cdsIdentificacao := TClientDataSet.Create(nil);
     FfrxIdentificacao := TfrxDBDataset.Create(nil);
     with FfrxIdentificacao do
     begin
        DataSet := cdsIdentificacao;
        OpenDataSource := False;
        Enabled := False;
        UserName := 'Identificacao';
     end;

 

Equipe ACBr Henrique Leonardo
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Tecnólogo em processamento de dados

E-mail [email protected] - Skype : hleorj

Link para o comentário
Compartilhar em outros sites

  • Moderadores

@hleorj

Como cite aqui: 

Citar

Para deixar a escolha mais parametrizável poderíamos criar uma diretiva para esse caso e assim não afetaria os projetos que ainda não adotaram o Firedac. 

Seria muito importante adicionar uma diretiva ser desativada por padrão.

Dessa forma tudo funciona como está e só os que preferirem ativariam e utilizariam.

Algo do tipo :

no ACBr.inc:
{IFDEF BORLAND}
 {.DEFINE USE_FIREDAC}
{$ENDIF}

nos fonte:
{$IFDEF USE_FIREDAC}
 //faz uso do dataset do faredac.
{$ENDIF}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Fundadores

Eu acho que nessas Units de relatório, não precisamos de nenhum componente de acesso a dados...

Os campos são criados em Run-time e isso sempre será fonte de problemas... porque não mapear, diretamente as propriedades do Objeto, para os "Labels/Memo" do relatório ?

Vejam por exemplo, o Boleto em Fortes...ACBrBoletoFCFortesFr.pas

Os campos são movidos do Objeto ACBrBoleto para Relatório, nos eventos "OnBeforePrint", das bandas... A lista de dados é alimentada usando: "OnDataCount", "OnDataRecord"

  • Curtir 1
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

  • Moderadores

@hleorj

Fiz uma breve analise sugestão proposta pelo @Daniel Simoes

Observei que há uma dependência de 03 DANFes do form base do fortes que são: ACBrNFeDANFeRLPaisagem.pas, ACBrNFeDANFeRLRetrato e ACBrNFeDANFeRLSimplificado.

Vou precisar da ajuda de ambos para definir:

Estrutura dos itens

  1. Criar uma lista de objetos similar ao dataset no form base do fortes e manter a logica em cada form
  2. Criar a lista de itens na classe base do DANFe e estender essas alterações para os demais DANFes.
  3. Usar a lista de itens do TNFe.
  4. Outras alternativas

Definir a paginação do DANFe.

Eu optaria pelo opção 2.

Motivos:

Objeto dos itens do DANFE poderão ser especializados e com a possibilidade de parametrização da paginação.

Link para o comentário
Compartilhar em outros sites

  • Moderadores

Fiz algumas alterações.

Mantive a estrutura atual até a definição de como faremos para remover a dependência dos dataset.

Puxei para o form base do fortes a obrigação de popular os dados.

Segue anexo

ACBrNFeDANFeRLRetrato.pas

ACBrNFeDANFeRLPaisagem.pas

ACBrNFeDANFeRL.pas

ACBrNFeDANFeRLSimplificado.pas

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Moderadores

@Waldir Paim..

Seria está opção :  Usar a lista de itens do TNFe.

E temos uma outra base como seguir : ACBrDANFCeFortesFr e ACBrDANFCeFortesFrA4

Anexo segue meu teste de viabilidade da implementação.

 

ACBrNFeDANFeRLRetrato.pas

ACBrNFeDANFeRLRetrato.dfm

Equipe ACBr Henrique Leonardo
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Tecnólogo em processamento de dados

E-mail [email protected] - Skype : hleorj

Link para o comentário
Compartilhar em outros sites

  • Moderadores

Bem.. com as linhas abaixo .. não existe mas dataset controlando a impressão dos itens.

procedure TfrlDANFeRLRetrato.RLBand1BeforePrint(Sender: TObject;
  var PrintIt: Boolean);
begin
  inherited;
  with FNFe.Det.Items[FNumItem] do
  begin
    txtCodigo1.Lines.Clear;
    txtCodigo1.Lines.Add(TACBrNFeDANFeRL(Owner).ManterCodigo(Prod.cEAN, Prod.CProd));
    rlmDescricao1.Lines.Clear;
    rlmDescricao1.Lines.Add(ManterXpod( Prod.XProd , FNumItem ));
    txtNCM1.Lines.Clear;
    txtNCM1.Lines.Add(Prod.NCM);
    txtCST1.Caption := Prod.NCM;
    case FNFe.Emit.CRT of
      crtRegimeNormal,
      crtSimplesExcessoReceita : txtCST1.Caption := OrigToStr(Imposto.ICMS.orig) + CSTICMSToStr(Imposto.ICMS.CST);
            crtSimplesNacional : txtCST1.Caption := OrigToStr(Imposto.ICMS.orig) + CSOSNIcmsToStr(Imposto.ICMS.CSOSN);
    end;
    txtCFOP1.Caption            := Prod.CFOP;
    txtUnidade1.Caption         := Prod.UCom;
    txtQuantidade1.Caption      := TACBrNFeDANFeRL(Owner).FormatQuantidade( Prod.qCom);
    txtValorUnitario1.Caption   := TACBrNFeDANFeRL(Owner).FormatValorUnitario(  Prod.vUnCom);
    txtValorTotal1.Caption      := FormatFloatBr(Prod.vProd, ',#0.00');
    txtValorDesconto1.Caption   := FormatFloatBr(ManterDesPro( Prod.vDesc ,Prod.vProd), ',#0.00');
    txtBaseICMS1.Caption        := FormatFloatBr(Imposto.ICMS.VBC, ',#0.00');
    txtValorICMS1.Caption       := FormatFloatBr(Imposto.ICMS.VICMS, ',#0.00');
    txtValorIPI1.Caption        := FormatFloatBr(Imposto.IPI.VIPI, ',#0.00');
    txtAliqICMS1.Caption        := FormatFloatBr(Imposto.ICMS.PICMS, ',#0.00');
    txtAliqIPI1.Caption         := FormatFloatBr(Imposto.IPI.PIPI, ',#0.00');
  end;
end;

procedure TfrlDANFeRLRetrato.subItensDataRecord(Sender: TObject; RecNo,
  CopyNo: Integer; var Eof: Boolean; var RecordAction: TRLRecordAction);
begin
  inherited;
  FNumItem := RecNo - 1 ;
  Eof := (RecNo > FNFe.Det.Count) ;
  RecordAction := raUseIt ;
end;

procedure TfrlDANFeRLRetrato.RLNFeDataRecord(Sender: TObject; RecNo,
  CopyNo: Integer; var Eof: Boolean; var RecordAction: TRLRecordAction);
begin
  inherited;
  Eof := (RecNo > 1);
  RecordAction := raUseIt;
end;

 

Equipe ACBr Henrique Leonardo
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Tecnólogo em processamento de dados

E-mail [email protected] - Skype : hleorj

Link para o comentário
Compartilhar em outros sites

  • Moderadores

@hleorj

Veja:

Citar

Vou precisar da ajuda de ambos para definir:

Estrutura dos itens

  1. Criar uma lista de objetos similar ao dataset no form base do fortes e manter a logica em cada form
  2. Criar a lista de itens na classe base do DANFe e estender essas alterações para os demais DANFes.
  3. Usar a lista de itens do TNFe.
  4. Outras alternativas

Definir a paginação do DANFe.

Eu optaria pelo opção 2.

Motivos:

Objeto dos itens do DANFE poderão ser especializados e com a possibilidade de parametrização da paginação.

A impressão ou a logica não não me preocupa, o que me gera um grande receio é o controle da pagina como destaquei acima.

Já vi problemas com esse tipo de aplicação aqui mesmo no DANFe do NFCe usando fortes pois os controle dos itens são dinâmicos e mudam de tamanho conforme o gosto do programador e você precisará de uma logica muito apurada para resolver isso.

Então mexer em algo estável em busca de remover uma dependência pode gerar efeitos colaterais indesejados com a paginação.

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 2876 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • 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.