Ir para conteúdo
Fórum Script Brasil
  • 0

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


airam1968

Pergunta

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,

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 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

Link para o comentário
Compartilhar em outros 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

Link para o comentário
Compartilhar em outros 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

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...