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.
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
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?
Pergunta
airam1968
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
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.