Como passar um array como parametro

08/03/2010

Olá,

Para receber dados do um sistema soap, uso da seguinte forma:
   essa parte é um array...


for I := 0 to high(RespDC.dadosContrato.contratos) - 0 do
begin
for J := Low(RespDC.dadosContrato.contratos[i].parcelas) to
              high(RespDC.dadosContrato.contratos[i].parcelas) do
begin
      CdsCTParc.Append;
      CdsCTParc.FieldByName('Contrato').AsString:= InttoStr(RespDC.dadosContrato.contratos[i].nrContrato);
      CdsCTParc.FieldByName('NossoNumero').AsString:=     InttoStr(RespDC.dadosContrato.contratos[i].parcelas[J].nossoNumero);
      CdsCTParc.FieldByName('Vencto').AsString :=DateToStr(RespDC.dadosContrato.contratos[i].parcelas[J].dataVencimento.asDate);
      CdsCTParc.FieldByName('ValorOrig').AsFloat  :=StrtoFloat( StringReplace(RespDC.dadosContrato.contratos[i].parcelas[J].valorOrigem.DecimalString, '.', ',',[rfReplaceAll, rfIgnoreCase]));
      CdsCTParc.FieldByName('ValorAtual').AsFloat  :=StrtoFloat( StringReplace(RespDC.dadosContrato.contratos[i].parcelas[J].valorAtualizado.DecimalString, '.', ',',[rfReplaceAll, rfIgnoreCase]));
      CdsCTParc.Post;
end;
end;



Agora tenho que passar um array como parametro, como faço?,  estou tentando isso, mas não funciona.


procedure TForm1.SBpgavClick(Sender: TObject);
var
 SimPGAvista:  simulacaoPagamentoAVistaRequest2;
 RespDC: simulacaoPagamentoAVistaResponse2;
 xDataPrev : TXSDate;
 xPercDesc, xDespesa, xHono, XMora : TXSDecimal;
 vCT : Int64;
 i, j :Integer;
begin

  xDataPrev := TXSDate.Create;
  xDataPrev.AsDate := DateTimePicker1.DateTime;
  xPercDesc := TXSDecimal.Create;
  xDespesa := TXSDecimal.Create;
  xHono := TXSDecimal.Create;
  xMora := TXSDecimal.Create;

SimPGAvista := simulacaoPagamentoAVistaRequest2.create;
RespDC := simulacaoPagamentoAVistaResponse2.create;

SimPGAvista.tipoOperacao:=5;
SimPGAvista.dataPrevisaoPgto := xDataPrev;
xPercDesc.DecimalString :=Edit15.Text;
SimPGAvista.porcentagemDescontoConcedido := xPercDesc;
xDespesa.DecimalString :=Edit16.Text;
SimPGAvista.valorDespesa:=xDespesa;
xHono.DecimalString :=Edit17.Text;
SimPGAvista.porcentagemCobrancaHonorario:=xHono;

aqui começa o array que tem 3 campos e pode conter até 99 arrays

SimPGAvista.contratos[0].codigoAplicativo:= 'AUF';
vCT:= StrToint64(CdsContratosContrato.AsString);
SimPGAvista.contratos[0].nrContrato:=vCT;
xMora.DecimalString:=Edit19.Text;
SimPGAvista.contratos[0].taxaMora :=xMora;


RespDC := GetMacMensageria().simulacaoPagamentoAVista(SimPGAvista);


como passo esse array como parametro?

abaixo segue detalhes desse array:




SimulacaoPagamentoAVistaRequest = class(TRemotable)
  private
    FcodigoAssessoriaCyber: Integer;
    FcontaCorrente: Int64;
    FcodigoIdentificacaoOperador: string;
    FtipoPessoa: string;
    FcpfCnpj: Int64;
    FtipoOperacao: Integer;
    FdataPrevisaoPgto: TXSDate;
    FtipoCobranca: Integer;
    FporcentagemDescontoConcedido: TXSDecimal;
    FvalorDespesa: TXSDecimal;
    FporcentagemCobrancaHonorario: TXSDecimal;
    Fcontratos: Array_Of_Mac003EntradaContratos;
  public
    constructor Create; override;
    destructor Destroy; override;
  published
    property codigoAssessoriaCyber:        Integer                          Index (IS_UNQL) read FcodigoAssessoriaCyber write FcodigoAssessoriaCyber;
    property contaCorrente:                Int64                            Index (IS_UNQL) read FcontaCorrente write FcontaCorrente;
    property codigoIdentificacaoOperador:  string                           Index (IS_UNQL) read FcodigoIdentificacaoOperador write FcodigoIdentificacaoOperador;
    property tipoPessoa:                   string                           Index (IS_UNQL) read FtipoPessoa write FtipoPessoa;
    property cpfCnpj:                      Int64                            Index (IS_UNQL) read FcpfCnpj write FcpfCnpj;
    property tipoOperacao:                 Integer                          Index (IS_UNQL) read FtipoOperacao write FtipoOperacao;
    property dataPrevisaoPgto:             TXSDate                          Index (IS_UNQL) read FdataPrevisaoPgto write FdataPrevisaoPgto;
    property tipoCobranca:                 Integer                          Index (IS_UNQL) read FtipoCobranca write FtipoCobranca;
    property porcentagemDescontoConcedido: TXSDecimal                       Index (IS_UNQL) read FporcentagemDescontoConcedido write FporcentagemDescontoConcedido;
    property valorDespesa:                 TXSDecimal                       Index (IS_UNQL) read FvalorDespesa write FvalorDespesa;
    property porcentagemCobrancaHonorario: TXSDecimal                       Index (IS_UNQL) read FporcentagemCobrancaHonorario write FporcentagemCobrancaHonorario;
    property contratos:                    Array_Of_Mac003EntradaContratos  Index (IS_UNBD or IS_UNQL) read Fcontratos write Fcontratos;
  end;


  Mac003EntradaContratos = class(TRemotable)
  private
    FcodigoAplicativo: string;
    FnrContrato: Int64;
    FtaxaMora: TXSDecimal;
  public
    destructor Destroy; override;
  published
    property codigoAplicativo: string      Index (IS_UNQL) read FcodigoAplicativo write FcodigoAplicativo;
    property nrContrato:       Int64       Index (IS_UNQL) read FnrContrato write FnrContrato;
    property taxaMora:         TXSDecimal  Index (IS_UNQL) read FtaxaMora write FtaxaMora;
  end;



Obrigado.

Henrique.







Henrique Rocha

Henrique Rocha

Curtidas 0

Respostas

Rodrigo Mourão

Rodrigo Mourão

08/03/2010

Olá, tente isso:

procedure TForm1.SBpgavClick(Sender: TObject);
var
 SimPGAvista:  simulacaoPagamentoAVistaRequest2;
 RespDC: simulacaoPagamentoAVistaResponse2;
 xDataPrev : TXSDate;
 xPercDesc, xDespesa, xHono, XMora : TXSDecimal;
 vCT : Int64;
 i, j :Integer;
 Contrato: Mac003EntradaContratos;
begin

xDataPrev := TXSDate.Create;
xDataPrev.AsDate := DateTimePicker1.DateTime;
xPercDesc := TXSDecimal.Create;
xDespesa := TXSDecimal.Create;
xHono := TXSDecimal.Create;
xMora := TXSDecimal.Create;

SimPGAvista := simulacaoPagamentoAVistaRequest2.create;
RespDC := simulacaoPagamentoAVistaResponse2.create;

SimPGAvista.tipoOperacao:=5;
SimPGAvista.dataPrevisaoPgto := xDataPrev;
xPercDesc.DecimalString :=Edit15.Text;
SimPGAvista.porcentagemDescontoConcedido := xPercDesc;
xDespesa.DecimalString :=Edit16.Text;
SimPGAvista.valorDespesa:=xDespesa;
xHono.DecimalString :=Edit17.Text;
SimPGAvista.porcentagemCobrancaHonorario:=xHono;

Primeira Opção
vCT:= StrToint64(CdsContratosContrato.AsString);
xMora.DecimalString:=Edit19.Text;

Contrato := Mac003EntradaContratos.create;
Contrato.codigoAplicativo:= 'AUF';
Contrato.nrContrato:=vCT;
Contrato.taxaMora :=xMora;
SimPGAvista.contratos[0] := Contrato;
ou

Segunda Opção
vCT:= StrToint64(CdsContratosContrato.AsString);
xMora.DecimalString:=Edit19.Text;
SimPGAvista.contratos[0] := Mac003EntradaContratos.create;
SimPGAvista.contratos[0].codigoAplicativo:= 'AUF';
SimPGAvista.contratos[0].nrContrato:=vCT;
SimPGAvista.contratos[0].taxaMora :=xMora;

RespDC := GetMacMensageria().simulacaoPagamentoAVista(SimPGAvista);

Att,


GOSTEI 0
Henrique Rocha

Henrique Rocha

08/03/2010

Olá, Rodrigo,

não funcionou

tentei desta forma:

procedure TForm1.SBpgavClick(Sender: TObject);
var
 SimPGAvista:  simulacaoPagamentoAVistaRequest2;
 RespDC: simulacaoPagamentoAVistaResponse2;
 xDataPrev : TXSDate;
 xPercDesc, xDespesa, xHono, XMora : TXSDecimal;
 vCT : Int64;
 i, j :Integer;
 Contrato :  Array OF Mac003EntradaContratos;
//  Contrato : Array_Of_Mac003EntradaContratos;

begin

  xDataPrev := TXSDate.Create;
  xDataPrev.AsDate := DateTimePicker1.DateTime;
  xPercDesc := TXSDecimal.Create;
  xDespesa := TXSDecimal.Create;
  xHono := TXSDecimal.Create;
  xMora := TXSDecimal.Create;

SimPGAvista := simulacaoPagamentoAVistaRequest2.create;
RespDC := simulacaoPagamentoAVistaResponse2.create;

SimPGAvista.codigoAssessoriaCyber:=100;
SimPGAvista.contaCorrente:=1;
SimPGAvista.codigoIdentificacaoOperador:='1';
SimPGAvista.tipoPessoa:=Edit14.Text;
SimPGAvista.cpfCnpj := StrToint64(Edit1.Text);
SimPGAvista.tipoOperacao:=5;
SimPGAvista.dataPrevisaoPgto := xDataPrev;
xPercDesc.DecimalString :=Edit15.Text;
SimPGAvista.porcentagemDescontoConcedido := xPercDesc;
{
  xPercDesc := TXSDecimal.Create;
  xDespesa := TXSDecimal.Create;
  xHono := TXSDecimal.Create;
  xMora := TXSDecimal.Create;
 }

xDespesa.DecimalString :=Edit16.Text;
SimPGAvista.valorDespesa:=xDespesa;
xHono.DecimalString :=Edit17.Text;
SimPGAvista.porcentagemCobrancaHonorario:=xHono;

// SimPGAvista.contratos[0].codigoAplicativo := 'AUF';
{
vCT:= StrToint64(CdsContratosContrato.AsString);
xMora.DecimalString:=Edit19.Text;
SimPGAvista.contratos[0] := c
SimPGAvista.contratos[0].codigoAplicativo:= 'AUF';
SimPGAvista.contratos[0].nrContrato:=vCT;
SimPGAvista.contratos[0].taxaMora :=xMora;
 }
// ntrato := Mac003EntradaContratos.create;
// Contrato[0].Create;
//Contrato:=Mac003EntradaContratos.create;
//SimPGAvista.contratos[0]:=Contrato;

Contrato[0].codigoAplicativo:='AUF';
vCT:= StrToint64(CdsContratosContrato.AsString);
Contrato[0].nrContrato:=vCT;
xMora.DecimalString:=Edit19.Text;
Contrato[0].taxaMora :=xMora;

RespDC := GetMacMensageria().simulacaoPagamentoAVista(SimPGAvista);
Edit23.Text:=RespDC.mensagemRetorno.mensagem;
Edit20.text:=RespDC.valorOperacao.DecimalString;
Edit13.text:=RespDC.valorHonorario.DecimalString;
Edit23.Text:=RespDC.mensagemRetorno.mensagem;

SimPGAvista.FREE;
RespDC.FREE;
End;


mas não sei como como relacionar o array que criei com o metodo (SimPGAvista); 

tem mais alguma idéia?
 
e  agora ele da um mensagem de erro tipo: Incompatib   types: Array_Of_Mac003EntradaContratos end Dynamic array.



GOSTEI 0
Rodrigo Mourão

Rodrigo Mourão

08/03/2010

Na verdade nao há segredos: Temo um array que é um lista, lista este de objetos contratos descritos no XML. Entao basicamente e criar o objeto, passar os valores para as propriedades e colocar dentro do array.   Geralmente a documentação do webservices ira descrever isso. Como não tenho a documentação em mãos então temos que trabalhar com a unit que o WS gera. Bem se desejar pode me enviar a unit gera para eu testar a compilação agora como o WS vai tratar isso do lado de lá você tera que ver junto ao provedor do serviço.   Att,
GOSTEI 0
Henrique Rocha

Henrique Rocha

08/03/2010

Bom dia,

segue o link para o .pas
http://video.devmedia.com.br/discovirtual/18998/BCO.zip

como tenho que manter confidencialidade com meu cliente alterei algumas
informações como nome,  ip e endereços...e também só funciona com ips cadastrados do outro lado.

Help...

Henrique
GOSTEI 0
Henrique Rocha

Henrique Rocha

08/03/2010

Boa tarde!

Rodrigo, consegui com um amigo meu o mesmo WebService só que em C Sharp, poderia dar
uma olhada para tentar fazer uma analogia para Delphi:


  /// <summary>
        /// O método SimularPagamentoAVista invoca o método XXXXMacMensageria.simulacaoPagamentoAVista do web service e recupera as informações fornecidas por ele.
        /// </summary>
        /// <param name="objTOSimularPagamentoAVista">O objeto TOSimularPagamentoAVista a ser transferido para o método.</param>
        /// <param name="objCASimularPagamentoAVista">O objeto CASimularPagamentoAVista a ser recuperado do método.</param>
        /// <returns>Retorna verdadeiro quando o método for executado com sucesso, ou falso caso contrário.</returns>
        public bool SimularPagamentoAVista(TOSimularPagamentoAVista objTOSimularPagamentoAVista, out CASimularPagamentoAVista objCASimularPagamentoAVista)
        {
            strDescricaoErro = String.Empty;
            CASimularPagamentoAVista _objCASimularPagamentoAVista = new CASimularPagamentoAVista();

            try
            {
                if (!bolAtivado)
                {
                    throw new Exception(msgServicoDesativado);
                }

                if (strURL == String.Empty)
                {
                    throw new Exception(msgURLNaoEspecificada);
                }

                if (objTOSimularPagamentoAVista.CodigoAssessoriaCyber == 0 ||
                    objTOSimularPagamentoAVista.CodigoIdentificacaoOperador == 0 ||
                    objTOSimularPagamentoAVista.ContaCorrente == 0 ||
                    objTOSimularPagamentoAVista.CPFCNPJCliente == String.Empty ||
                    objTOSimularPagamentoAVista.TipoPessoa == String.Empty)
                {
                    throw new Exception(msgFaltaDados);
                }

                System.Net.ServicePointManager.CertificatePolicy = new WebServicePolicy();

                WebService.XXXXMacMensageria objXXXXMacMensageria = new WebService.XXXXMacMensageria();

                objXXXXMacMensageria.Url = strURL;
                objXXXXMacMensageria.Timeout = intWebServiceTimeout;

                WebService.Mac003EntradaContratos[] objMac003EntradaContratos = new WebService.Mac003EntradaContratos[objTOSimularPagamentoAVista.Contratos.Rows.Count];
                WebService.Mac003SaidaContratos[] objMac003SaidaContratos = null;
                WebService.MensagemRetorno objMensagemRetorno = null;

                for (int i = 0; i < objTOSimularPagamentoAVista.Contratos.Rows.Count; i++)
                {
                    DataRow drContrato = objTOSimularPagamentoAVista.Contratos.Rows[i];

                    objMac003EntradaContratos[i] = new WebService.Mac003EntradaContratos();

                    objMac003EntradaContratos[i].codigoAplicativo = ConverterSiglaAplicativo(drContrato[CAContrato.SiglaAplicativo].ToString());
                    objMac003EntradaContratos[i].nrContrato = Convert.ToInt64(drContrato[CAContrato.NumeroContrato]);
                    objMac003EntradaContratos[i].taxaMora = Convert.ToDecimal(drContrato[CAContrato.TaxaMora]);
                }

                bool bolSpecified;

                decimal ValorOperacao = 0;
                decimal ValorOperacaoComDesconto = 0;
                decimal ValorHonorarios = 0;
                string IndicativoAlcadaDescontoConcedido = String.Empty;
                string IndicativoAlcadaPorcentagemCobrancaHonorarios = String.Empty;

                try
                {
                    objXXXXMacMensageria.simulacaoPagamentoAVista
                    (
                        objTOSimularPagamentoAVista.CodigoAssessoriaCyber,
                        objTOSimularPagamentoAVista.ContaCorrente,
                        objTOSimularPagamentoAVista.CodigoIdentificacaoOperador.ToString(),
                        objTOSimularPagamentoAVista.TipoPessoa,
                        Convert.ToInt64(objTOSimularPagamentoAVista.CPFCNPJCliente),
                        objTOSimularPagamentoAVista.TipoOperacao,
                        objTOSimularPagamentoAVista.DataPrevisaoPagamento,
                        objTOSimularPagamentoAVista.TipoCobranca,
                        Convert.ToDecimal(objTOSimularPagamentoAVista.PorcentagemDescontoConcedido),
                        objTOSimularPagamentoAVista.ValorDespesa,
                        Convert.ToDecimal(objTOSimularPagamentoAVista.PorcentagemCobrancaHonorarios),
                        objMac003EntradaContratos,
                        out ValorOperacao,
                        out bolSpecified,
                        out ValorOperacaoComDesconto,
                        out bolSpecified,
                        out ValorHonorarios,
                        out bolSpecified,
                        out IndicativoAlcadaDescontoConcedido,
                        out IndicativoAlcadaPorcentagemCobrancaHonorarios,
                        out objMac003SaidaContratos,
                        out objMensagemRetorno
                     );

                    _objCASimularPagamentoAVista.MensagemRetorno.CodigoRetorno = objMensagemRetorno.returnCode;
                    _objCASimularPagamentoAVista.MensagemRetorno.CodigoMotivo = objMensagemRetorno.reasonCode;
                    _objCASimularPagamentoAVista.MensagemRetorno.Mensagem = objMensagemRetorno.mensagem;
                }
                catch (Exception excErroWS)
                {
                    _objCASimularPagamentoAVista.MensagemRetorno.CodigoRetorno = -1;
                    _objCASimularPagamentoAVista.MensagemRetorno.CodigoMotivo = -1;
                    _objCASimularPagamentoAVista.MensagemRetorno.Mensagem = excErroWS.Message;
                }

                this.strMensagemRetorno = String.Format(msgMensagemRetorno,
                                        _objCASimularPagamentoAVista.MensagemRetorno.CodigoRetorno,
                                        _objCASimularPagamentoAVista.MensagemRetorno.CodigoMotivo,
                                        _objCASimularPagamentoAVista.MensagemRetorno.Mensagem);

                if (_objCASimularPagamentoAVista.MensagemRetorno.CodigoRetorno == 0)
                {
                    foreach (WebService.Mac003SaidaContratos objMac003SaidaContrato in objMac003SaidaContratos)
                    {
                        DataRow drContrato = _objCASimularPagamentoAVista.Contratos.NewRow();

                        drContrato[CAContrato.GrupoProduto] = ConsultarGrupoProduto(objMac003SaidaContrato.codigoAplicativo);
                        drContrato[CAContrato.SiglaAplicativo] = ConsultarSiglaAplicativo(objMac003SaidaContrato.codigoAplicativo);
                        drContrato[CAContrato.IndicativoAlcadaTaxaMora] = ConverterIndicador(objMac003SaidaContrato.indicativoAlcadaTaxaMora);
                        drContrato[CAContrato.IndicativoElegibilidade] = ConverterIndicador(objMac003SaidaContrato.indicativoElegibilidade);
                        drContrato[CAContrato.NumeroContrato] = objMac003SaidaContrato.nrContrato.ToString().PadLeft(18, '0');
                        drContrato[CAContrato.QuantidadeDiasAtraso] = objMac003SaidaContrato.qtdeDiasAtraso;
                        drContrato[CAContrato.TaxaMora] = objMac003SaidaContrato.taxaMora;
                        drContrato[CAContrato.ValorOrigem] = objMac003SaidaContrato.valorOrigem;
                        drContrato[CAContrato.ValorAcordo] = objMac003SaidaContrato.valorParaAcordo;
                        drContrato[CAContrato.ValorTarifaLiquidacaoAntecipado] = objMac003SaidaContrato.valorTarifaLiquidacaoAntecipado;

                        _objCASimularPagamentoAVista.Contratos.Rows.Add(drContrato);
                    }

                    _objCASimularPagamentoAVista.ValorOperacao = ValorOperacao;
                    _objCASimularPagamentoAVista.ValorOperacaoComDesconto = ValorOperacaoComDesconto;
                    _objCASimularPagamentoAVista.ValorHonorarios = ValorHonorarios;
                    _objCASimularPagamentoAVista.IndicativoAlcadaDescontoConcedido = ConverterIndicador(IndicativoAlcadaDescontoConcedido);
                    _objCASimularPagamentoAVista.IndicativoAlcadaPorcentagemCobrancaHonorarios = ConverterIndicador(IndicativoAlcadaPorcentagemCobrancaHonorarios);
                }

                objCASimularPagamentoAVista = _objCASimularPagamentoAVista;
                objTOSimularPagamentoAVista.LimparAtributos();
                return true;
            }
            catch (Exception excErro)
            {
                //strDescricaoErro = String.Format(msgMensagemErro, excErro.Message, excErro.Source, excErro.StackTrace);
                strDescricaoErro = excErro.Message;
                _objCASimularPagamentoAVista.LimparAtributos();
                objCASimularPagamentoAVista = _objCASimularPagamentoAVista;
                objTOSimularPagamentoAVista.LimparAtributos();
                return false;
            }
        }


Obrigado.

Henrique.



GOSTEI 0
Rodrigo Mourão

Rodrigo Mourão

08/03/2010

Vou verificar e lhe retorno.

Att.
GOSTEI 0
Rodrigo Mourão

Rodrigo Mourão

08/03/2010

OlÁ jOSE.

Eu repoduzi aqui e funcionou, digo compilou porem nao da para testar. O que eu reparei e que no codigo que voce postrou vc tem uma variavel contrato do tipo Array OF Mac003EntradaContratos veja:

Olá, Rodrigo,

não funcionou

tentei desta forma:

procedure TForm1.SBpgavClick(Sender: TObject);
var
 SimPGAvista:  simulacaoPagamentoAVistaRequest2;
 RespDC: simulacaoPagamentoAVistaResponse2;
 xDataPrev : TXSDate;
 xPercDesc, xDespesa, xHono, XMora : TXSDecimal;
 vCT : Int64;
 i, j :Integer;
 Contrato :  Array OF Mac003EntradaContratos;
//  Contrato : Array_Of_Mac003EntradaContratos;


MAs na verdade nao tem que ser do tipo array e sim do tipo Mac003EntradaContratos conforme eu postei no dia 8/3/2010 3:12:44 PM

Voce cria um contrato e coloca na lista de contratos. Array nao se instancia, nao em delphi. Entao o conceito é.

Cria um objeto contrato, passa os valores e colocar no array. O seu amigo de C# fez isso dentro de um for. REpare que ele cria contrato e coloca dentro do array.

Revise seu codigo seguindo este conceito e volte a me informar.

Att.


GOSTEI 0
Henrique Rocha

Henrique Rocha

08/03/2010

OK, pode encerrar o chamado.
Obrigado.
GOSTEI 0
POSTAR