airam1968
Membros-
Total de itens
3 -
Registro em
-
Última visita
Tudo que airam1968 postou
-
(Resolvido) Delphi 10.1 REST API - Dificuldade em Montar um TObjectList
pergunta respondeu ao airam1968 de airam1968 em Delphi, Kylix
Obrigado Jhonas, vou verificar as dicas que passou e retorno aqui para postar a evolução disso. Obrigado mais uma vez. -
(Resolvido) Delphi 10.1 REST API - Dificuldade em Montar um TObjectList
pergunta respondeu ao airam1968 de airam1968 em Delphi, Kylix
Olá Jhonas, Obrigado pelo reply, já tinha passado por este link em pesquisa anterior, mais meu problema não é um objeto de 1 camada, tenho um objeto com 3 camadas, e não consigo preencher as sub camadas que são outros objetos. Eu consigo montar o GET perfeitamente quando a sua estrutura. eu não consigo é levar todos os dados que preciso, abaixo tem um inspect do meu objeto um instante antes de gerar o JSON para o GET, perceba que os 2 ultimos itens, objetos Fitens e Ftitulos estão vazios porque realmente não sei como preenche-los. -
Bom Dia, Tenho um Servidor REST MVC com SQL Server que necessita retornar uma leitura do banco de dados com a estrutura (Cabeçalho + n Itens + n Títulos) portanto criei um uma classe com os dados de cabeçalho e duas classes com os Itens e Títulos para compor o objeto total. Como Segue Abaixo: type //Classe Item TDespesaItemModel = class private //Itens NF FIditem : string; FIdrd : string; FVlritem : Currency; FCcusto : string; FHistitem : string; private { Private declarations } public { Public declarations } property Iditem : String read FIditem write FIditem; property Idrd : String read FIdrd write FIdrd; property Vlritem : Currency read FVlritem write FVlritem; property Ccusto : string read FCcusto write FCcusto; property Histitem : string read FHistitem write FHistitem; end; TArrayItens = array of TDespesaItemModel; //Classe Titulo TDespesaTituloModel = class private //Itens Titulos FIdtitulo : string; FVencimento : string; FValor : Currency; FCnpj : string; FNome : string; FFantasia : string; FParcela : string; FTipotit : string; FProvisorio : string; private { Private declarations } public { Public declarations } property Idtitulo : String read FIdtitulo write FIdtitulo; property Vencimento : String read FVencimento write FVencimento; property Valor : Currency read FValor write FValor; property Cnpj : string read FCnpj write FCnpj; property Nome : string read FNome write FNome; property Fantasia : string read FFantasia write FFantasia; property Parcela : string read FParcela write FParcela; property Tipotit : string read FTipotit write FTipotit; property Provisorio : string read FProvisorio write FProvisorio; end; TArrayTitulos = array of TDespesaTituloModel; //Classe Despesa (NF + Itens + Titulos) TDespesaModel = class private //Cabeçalho NF FId : String; FLoja : String; FTipo : String; FConta : String; FDoc : String; FSerie : String; FTiponf : string; FCnpjfor : string; FNomefor : string; FNomefan : string; FHistorico : string; FEmissao : String; FDtlan : String; FValor : Currency; FEstorno : string; FChvnfe : string; FLinkxml : string; //Itens NF FItens : TArrayItens; //Itens Titulos FTitulos : TArrayTitulos; private { Private declarations } public { Public declarations } function Incluir(AJSON: TJSONObject): TJSONValue; //put function Alterar(AJSON: TJSONObject): TJSONValue; //post function Excluir(AId: String): TJSONValue; // delete function Obter: TJSONArray; //get property Id : String read FId write FId; property Loja : String read FLoja write FLoja; property Tipo : String read FTipo write FTipo; property Conta : String read FConta write FConta; property Doc : String read FDoc write FDoc; property Serie : String read FSerie write FSerie; property Tiponf : string read FTiponf write FTiponf; property Cnpjfor : string read FCnpjfor write FCnpjfor; property Nomefor : string read FNomefor write FNomefor; property Nomefan : string read FNomefan write FNomefan; property Historico: string read FHistorico write FHistorico; property Emissao : String read FEmissao write FEmissao; property Dtlan : String read FDtlan write FDtlan; property Valor : Currency read FValor write FValor; property Estorno : string read FEstorno write FEstorno; property Chvnfe : string read FChvnfe write FChvnfe; property Linkxml : string read FLinkxml write FLinkxml; property Itens : TArrayItens read FItens write FItens; property Titulos : TArrayTitulos read FTitulos write FTitulos; end; TDespesaModels = TObjectList<TDespesaModel>; Com esta estrutura meu servidor funciona perfeitamente, para PUT, POST, DELETE. Mais preciso montar o GET, retornando o conteúdo abaixo: { "id": "010100075689000100025701N", "loja": "000000000001", "tipo": "01", "conta": "0987654321", "doc": "000756890", "serie": "001", "tiponf": "NFE", "cnpjfor": "07946894000156", "nomefor": "Phoenyx Consultoria, treinamento e Desenv. Soft", "nomefan": "Phoenyx Tecnologia", "historico": "Phoenyx Consultoria, treinamento e Desenv. Soft20200220000756890", "emissao": "20200220", "dtlan": "20200220", "valor": 17351.28, "estorno": "N", "chvnfe": "35080599999090910270550010000000015180051273", "linkxml": "35080599999090910270550010000000015180051273.xml", "itens": [ { "iditem": "010100075689000100025701N01", "idrd": "012345678901", "vlritem": 5351, "ccusto": "000101347", "histitem": "001PCBALCAO ELETRONICO" }, { "iditem": "010100075689000100025701N02", "idrd": "012345678949", "vlritem": 12000.28, "ccusto": "000101348", "histitem": "006PCBANCO ALMOFADADO" } ], "titulos": [ { "idtitulo": "01010007568900010002570101NF", "vencimento": "20200320", "valor": 17351.28, "cnpj": "07946894000156", "nome": "Phoenyx Consultoria, treinamento e Desenv. Soft", "fantasia": "Phoenyx Tecnologia", "parcela": "01", "tipotit": "NF", "provisorio": "N" }, { "idtitulo": "01010007568900010002570102IMP", "vencimento": "20200320", "valor": 1067.1, "cnpj": "07946894000156", "nome": "Phoenyx Consultoria, treinamento e Desenv. Soft", "fantasia": "Phoenyx Tecnologia", "parcela": "02", "tipotit": "IMP", "provisorio": "S" } ] } Para isso tenho 3 tabelas no SQL, Cabeçalho, Itens e Títulos. Agora abaixo vou apresentar o problema que tenho enfrentando para construir um Objeto para depois transforma-lo em um objeto JSON e remeter como Response: function TDespesaDao.Obter: TObjectList<TDespesaModel>; var VQry : TFDQuery; VQryi : TFDQuery; VQryt : TFDQuery; VLista : TObjectList<TDespesaModel>; VDespesa : TDespesaModel; VItens : TArrayItens; VTitulos : TArrayTitulos; i, j : integer; begin VQry := TSistemaControl.GetInstance().Conexao.CriarQuery(); VQryi := TSistemaControl.GetInstance().Conexao.CriarQuery(); VQryt := TSistemaControl.GetInstance().Conexao.CriarQuery(); VQry.Open('select * from dbo.TOTVS001 with(nolock) ' + ' order by 1'); //where TOTVS001.ID_NF = '010100075689000100025701N' VQry.First; // //Itens NF VQryi.Open('select * from dbo.TOTVS001Item with(nolock) ' + ' where id_nf = ' + QuotedStr(VQry.FieldByName('id_nf').AsString) + ' order by 1'); VQryi.First; // //Titulos VQryt.Open('select * from dbo.TOTVS001Tit with(nolock) ' + ' where id_nf = ' + QuotedStr(VQry.FieldByName('id_nf').AsString) + ' order by 1'); VQryt.First; //Cabeçalho VLista := TObjectList<TDespesaModel>.Create; while not VQry.Eof do begin VDespesa := TDespesaModel.Create; VDespesa.Id := VQry.FieldByName('id_nf').AsString; VDespesa.Loja := VQry.FieldByName('loja').AsString; VDespesa.Tipo := VQry.FieldByName('tipo').AsString; VDespesa.Conta := VQry.FieldByName('conta').AsString; VDespesa.Doc := VQry.FieldByName('doc').AsString; VDespesa.Serie := VQry.FieldByName('serie').AsString; VDespesa.Tiponf := VQry.FieldByName('tiponf').AsString; VDespesa.Cnpjfor := VQry.FieldByName('cnpjfor').AsString; VDespesa.Nomefor := VQry.FieldByName('nomefor').AsString; VDespesa.Nomefan := VQry.FieldByName('nomefan').AsString; VDespesa.Historico := VQry.FieldByName('historico').AsString; VDespesa.Emissao := VQry.FieldByName('emissao').AsString; VDespesa.Dtlan := VQry.FieldByName('dtlan').AsString; VDespesa.Valor := VQry.FieldByName('valor').AsCurrency; VDespesa.Estorno := VQry.FieldByName('estorno').AsString; VDespesa.Chvnfe := VQry.FieldByName('chvnfe').AsString; VDespesa.Linkxml := VQry.FieldByName('linkxml').AsString; //Como incluir os Itens dentro do objeto Principal? SetLength(VItens, 1); VItens := [[VQryi.FieldByName('Iditem').AsString, VQryi.FieldByName('idrd').AsString, VQryi.FieldByName('vlritem').AsCurrency, VQryi.FieldByName('ccusto').AsString, VQryi.FieldByName('histitem').AsString]]; /////////////////////////////////////////////////////////////////////////////// VLista.Add(VDespesa); VQry.Next; end; // VQry.Close; VQryi.Close; VQryt.Close; Result := VLista; end; A partir deste momento a Vlista é remetida para ser colocada no RESPONSE. Agradeço antecipadamente qualquer ajuda, Atenciosamente,