Ir para conteúdo
  • Cadastre-se

dev botao

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

Recommended Posts

Postado (editado)

Caros colegas,

 

Eu não sei como o projeto ACBr gera os DANFe's, e estou um pouco apurado agora para procurar na base de código. Mas segue uma procedure que le um TObject e joga todas as suas propriedades (e até collections) dentro de variáveis do FastReport, usando o RTTI. Isso é útil para fazer um Danfe usando os nomes de propriedades do próprio TNFe. Exemplo: <NFe.infNFe.ID>

Procedure GetVars(Vars: TfrxArray; AObject: TObject; Prefix: String);
Var I, Count: Integer;
    PList: PPropList;
Begin
    If Not Assigned(AObject) Then
        Exit;

    If AObject Is TCollection Then Begin
        Vars[Prefix + '.Count'] := TCollection(AObject).Count;
        For I := 0 To TCollection(AObject).Count - 1 Do
            GetVars(Vars, TCollection(AObject).Items[I], Prefix + '[' + IntToStr(I) + ']');
    End;

    Count := GetPropList(AObject, PList);
    For I := 0 To Count - 1 Do Begin
        If PList^[I].PropType^.Kind = tkClass Then
            GetVars(Vars, GetObjectProp(AObject, PList^[I].Name), Prefix + '.' + PList^[I].Name)
        Else If PList^[I].PropType^.Kind = tkEnumeration Then
            Vars[Prefix + '.' + PList^[I].Name] := GetOrdProp(AObject, PList^[I].Name)
        Else Begin
            Case PList^[I].PropType^.Kind Of
                tkLString: Vars[Prefix + '.' + PList^[I].Name] := AnsiQuotedStr(GetStrProp(AObject, PList^[I].Name), '''');
                tkInteger, tkFloat: Vars[Prefix + '.' + PList^[I].Name] := GetPropValue(AObject, PList^[I].Name);
            End;
        End;
    End;
End;



Var NFe: TNFe;
    Vars: TfrxArray;
begin
    Vars := TfrxArray.Create;
    NFe := TNFe.Create;
    Try
        ...

        GetVars(Vars, NFe, 'NFe');

        frxReport1.Variables.Assign(Vars);
        frxReport1.ShowReport;
    Finally
        NFe.Free;
        Vars.Free;
    End;
end;

Para acessar os itens de collections, tem que fazer algo assim em um MasterData (ou outra banda de dados):

[Get('NFe.Det[' + IntToStr(<Line> - 1) + '].Prod.xProd')]

E você pode colocar esse código no OnBeforePrint para definir o número correto de linhas do MasterData (defina como 1 inicialmente, para que ele seja impresso):

    MasterData1.RowCount := <NFe.Det.Count>;

PS: Fiz usando a versão antiga do RTTI (pré-D2010) porque uso D7 e não faço idéia de como fica no Lazarus/FPC.

 

Abraços,

Gabriel.

Editado por Gabriel Frones
  • Este tópico foi criado há 3555 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.