Contar elementos de um Array
Bom dia!
Help,
Em um sistema soap, retorna para mim um array com 4 elementos, acontece
que nem sempre volta os quatro elementos do array,
e quando eu faço um insert em uma ClientDataSet e um dos array não vem ele me causa um erro de excessão.
Exemplo:
pega o primento elemento...
if ( RespDC.dadosContrato.contratos[i].parcelas[0].nossoNumero <> 0 ) then
begin
CdsContratos.FieldByName('NossoNumpc1').AsString:= InttoStr(RespDC.dadosContrato.contratos[i].parcelas[0].nossoNumero);
CdsContratos.FieldByName('DTVCp1').AsString :=DateToStr(RespDC.dadosContrato.contratos[i].parcelas[0].dataVencimento.asDate);
CdsContratos.FieldByName('VLPC1').AsFloat :=StrtoFloat( StringReplace(RespDC.dadosContrato.contratos[i].parcelas[0].valorOrigem.DecimalString, '.', ',',[rfReplaceAll, rfIgnoreCase]));
CdsContratos.FieldByName('VLPC1Atual').AsFloat :=StrtoFloat( StringReplace(RespDC.dadosContrato.contratos[i].parcelas[0].valorAtualizado.DecimalString, '.', ',',[rfReplaceAll, rfIgnoreCase]));
end;
pega o segundo, que não existe... ai causa a excessão...
if ( RespDC.dadosContrato.contratos[i].parcelas[1].nossoNumero <> 0 ) then
begin
CdsContratos.FieldByName('NossoNumpc2').AsString:= InttoStr(RespDC.dadosContrato.contratos[i].parcelas[1].nossoNumero);
CdsContratos.FieldByName('DTVCp2').AsString :=DateToStr(RespDC.dadosContrato.contratos[i].parcelas[1].dataVencimento.asDate);
CdsContratos.FieldByName('VLPC2').AsFloat :=StrtoFloat( StringReplace(RespDC.dadosContrato.contratos[i].parcelas[1].valorOrigem.DecimalString, '.', ',',[rfReplaceAll, rfIgnoreCase]));
CdsContratos.FieldByName('VLPC2Atual').AsFloat :=StrtoFloat( StringReplace(RespDC.dadosContrato.contratos[i].parcelas[1].valorAtualizado.DecimalString, '.', ',',[rfReplaceAll, rfIgnoreCase]));
end;
Pergunta:
Esse array tem 5 campos, e pode tem até quatro elementos.
1 - Como faço para contar quantos elementos tem esse array?
2 - Como faço para saber se um desses campos que compoem o array esta vázio?
Obrigado.
Henrique
Help,
Em um sistema soap, retorna para mim um array com 4 elementos, acontece
que nem sempre volta os quatro elementos do array,
e quando eu faço um insert em uma ClientDataSet e um dos array não vem ele me causa um erro de excessão.
Exemplo:
pega o primento elemento...
if ( RespDC.dadosContrato.contratos[i].parcelas[0].nossoNumero <> 0 ) then
begin
CdsContratos.FieldByName('NossoNumpc1').AsString:= InttoStr(RespDC.dadosContrato.contratos[i].parcelas[0].nossoNumero);
CdsContratos.FieldByName('DTVCp1').AsString :=DateToStr(RespDC.dadosContrato.contratos[i].parcelas[0].dataVencimento.asDate);
CdsContratos.FieldByName('VLPC1').AsFloat :=StrtoFloat( StringReplace(RespDC.dadosContrato.contratos[i].parcelas[0].valorOrigem.DecimalString, '.', ',',[rfReplaceAll, rfIgnoreCase]));
CdsContratos.FieldByName('VLPC1Atual').AsFloat :=StrtoFloat( StringReplace(RespDC.dadosContrato.contratos[i].parcelas[0].valorAtualizado.DecimalString, '.', ',',[rfReplaceAll, rfIgnoreCase]));
end;
pega o segundo, que não existe... ai causa a excessão...
if ( RespDC.dadosContrato.contratos[i].parcelas[1].nossoNumero <> 0 ) then
begin
CdsContratos.FieldByName('NossoNumpc2').AsString:= InttoStr(RespDC.dadosContrato.contratos[i].parcelas[1].nossoNumero);
CdsContratos.FieldByName('DTVCp2').AsString :=DateToStr(RespDC.dadosContrato.contratos[i].parcelas[1].dataVencimento.asDate);
CdsContratos.FieldByName('VLPC2').AsFloat :=StrtoFloat( StringReplace(RespDC.dadosContrato.contratos[i].parcelas[1].valorOrigem.DecimalString, '.', ',',[rfReplaceAll, rfIgnoreCase]));
CdsContratos.FieldByName('VLPC2Atual').AsFloat :=StrtoFloat( StringReplace(RespDC.dadosContrato.contratos[i].parcelas[1].valorAtualizado.DecimalString, '.', ',',[rfReplaceAll, rfIgnoreCase]));
end;
Pergunta:
Esse array tem 5 campos, e pode tem até quatro elementos.
1 - Como faço para contar quantos elementos tem esse array?
2 - Como faço para saber se um desses campos que compoem o array esta vázio?
Obrigado.
Henrique
Henrique Rocha
Curtidas 0
Respostas
Rodrigo Mourão
05/03/2010
Não faca com IF, faca com LOOP
for J := Low(RespDC.dadosContrato.contratos[i].parcelas) to
high(RespDC.dadosContrato.contratos[i].parcelas) do
begin
CdsContratos.FieldByName('NossoNumpc1').AsString:= InttoStr(RespDC.dadosContrato.contratos[i].parcelas[J].nossoNumero);
CdsContratos.FieldByName('DTVCp1').AsString :=DateToStr(RespDC.dadosContrato.contratos[i].parcelas[J].dataVencimento.asDate);
CdsContratos.FieldByName('VLPC1').AsFloat :=StrtoFloat( StringReplace(RespDC.dadosContrato.contratos[i].parcelas[J].valorOrigem.DecimalString, '.', ',',[rfReplaceAll, rfIgnoreCase]));
CdsContratos.FieldByName('VLPC1Atual').AsFloat :=StrtoFloat( StringReplace(RespDC.dadosContrato.contratos[i].parcelas[J].valorAtualizado.DecimalString, '.', ',',[rfReplaceAll, rfIgnoreCase]));
end;
Assim se tiver 1 parcela ele faz uma vez se tiver 1000 percelas ele 1000 vezes.
Att,
for J := Low(RespDC.dadosContrato.contratos[i].parcelas) to
high(RespDC.dadosContrato.contratos[i].parcelas) do
begin
CdsContratos.FieldByName('NossoNumpc1').AsString:= InttoStr(RespDC.dadosContrato.contratos[i].parcelas[J].nossoNumero);
CdsContratos.FieldByName('DTVCp1').AsString :=DateToStr(RespDC.dadosContrato.contratos[i].parcelas[J].dataVencimento.asDate);
CdsContratos.FieldByName('VLPC1').AsFloat :=StrtoFloat( StringReplace(RespDC.dadosContrato.contratos[i].parcelas[J].valorOrigem.DecimalString, '.', ',',[rfReplaceAll, rfIgnoreCase]));
CdsContratos.FieldByName('VLPC1Atual').AsFloat :=StrtoFloat( StringReplace(RespDC.dadosContrato.contratos[i].parcelas[J].valorAtualizado.DecimalString, '.', ',',[rfReplaceAll, rfIgnoreCase]));
end;
Assim se tiver 1 parcela ele faz uma vez se tiver 1000 percelas ele 1000 vezes.
Att,
GOSTEI 0
Henrique Rocha
05/03/2010
OK, funcionou.
Obrigado.
Pode encerrar o chamado.
até logo.
Obrigado.
Pode encerrar o chamado.
até logo.
GOSTEI 0