Jump to content
Fórum Script Brasil
  • 0
Sign in to follow this  
airam1968

(Resolvido) Delphi 10.1 REST API - Dificuldade em Montar um TObjectList

Question

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,

Share this post


Link to post
Share on other sites

4 answers to this question

Recommended Posts

  • 0
15 minutos atrás, airam1968 disse:

Com esta estrutura meu servidor funciona perfeitamente, para PUT, POST, DELETE.

Mais preciso montar o GET

Acho que vai encontrar a solução num desses links: 

https://www.google.com.br/search?ei=DOV0XvL8DPfH5OUPtOuYgAc&q=get+value+from+json+object+delphi&o que=json+get+value+delphi&gs_l=psy-ab.1.1.0i22i30l3.4420.9820..18068...0.2..0.234.1128.0j6j1......0....1..gws-wiz.......0i71j0j0i67j33i22i29i30..26%3A133.PVPTvUCletc

abraço

Share this post


Link to post
Share on other sites
  • 0

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.

 

image.png.8628e509424df172ee20003efb0c5cce.png

Share this post


Link to post
Share on other sites
  • 0

perceba que os 2 ultimos itens, objetos Fitens e Ftitulos estão vazios porque realmente não sei como preenche-los.

VItens : TArrayItens;
VTitulos : TArrayTitulos;

Veja se esse exemplo te ajuda:

https://www.projetoacbr.com.br/forum/topic/51803-pegar-valor-de-array-json-dentro-de-um-array-json-ifood/

ou esses

https://www.google.com.br/search?ei=lTR2XqegBpTE5OUPr6KrwA8&q=array+json+delphi&o que=array+json&gs_l=psy-ab.1.2.0l10.393148.401126..406010...3.2..0.196.1706.4j11......0....1..gws-wiz.....0..0i71j0i67j0i10..26%3A111.HxU2-iZFOc4

OBS: como teste, tente ler apenas um item do array

ou jogue o conteudo do array num TMemo

abraço

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  



  • Forum Statistics

    • Total Topics
      148593
    • Total Posts
      644162
×
×
  • Create New...