user734781
user734781

Reputation: 273

Initiating a SOAP Array on Delphi

I am trying to initialize or create an array of a soap call:

Array_Of_ProductIdentifierClinicalType = array of ProductIdentifierClinicalType;

This is the way that I am trying to initialize it:

Product[0].IdentifierType := Array_Of_ProductIdentifierClinicalType.Create();

When I run the application I get this error: Access Violation at address...

enter image description here

The question would be: How to initialize this soap call??

Thank you for your time!!!! You can do a WSDL import on: http://axelcarreras.dyndns.biz:3434/WSAlchemy.wsdl

procedure TFrmMain.Button16Click(Sender: TObject);
Var
  ExcludeExpiradas: String;
  Serv: AlchemyServiceSoap;
  req: AlchemyClinical;
  element: AlchemyClinicalRequest;
  Prescribed: PrescribedType;
  //Prescribing: Prescribing
  Prescribing: PrescribedType;
  alc: AlchemyIdentifierType;
  D: TXSDate;
  Counter: Integer;
  ProductStr: AlchemyIdentifierClinicalType;


begin

  With DM do
  begin
    ExcludeExpiradas := ' and (' + chr(39) +  DateToStr(Date) + chr(39) + ' < (FECHARECETA + 180)) ';
    CDSRx_Procesadas.Close;
    CDSRx_Procesadas.CommandText := 'SELECT * ' +
    ' FROM RX_PROCESADAS WHERE ' +
    ' (NUMERORECETA IS NOT NULL AND CANTIDAD_DISPONIBLE > 0)' +
     ExcludeExpiradas +
    ' and NumeroCliente = ' + CDSPacientesNumeroCliente.asString +
    ' Order by NumeroReceta';
    //ShowMessage(CDSRx_Procesadas.CommandText);
    CDSRx_Procesadas.Open;

    ProductStr := AlchemyIdentifierClinicalType.Create;
    With ProductStr do
    begin
      Identifier := 1;
    end;

    element := AlchemyClinicalRequest.Create;
    //Prescribed := PrescribedType.Create;
    With element do
    begin
      With Prescribed do
      begin
        Counter := 0;
        while not CDSRx_Procesadas.eof do
        begin
          Product := Array_Of_ProductIdentifierClinicalType.Create();
          With Product[0] do
          begin
            IdentifierType := ProductIdentifierTypeEnum.NDC9;
            Identifier := Copy(DM.CDSInventarioNDC.Value, 1, 9);
          end;
          Counter := Counter + 1;
          CDSRx_Procesadas.Next;
        end;
      end;
      With Prescribing do
      begin
        Counter := 0;
        Product[0].IdentifierType := ProductIdentifierTypeEnum.AlchemyProductID;
        Product[0].Identifier := Copy(DM.CDSInventarioNDC.Value, 1, 9);
        Counter := Counter + 1;
      end;
      With PatientDemographics do
      begin
        while not CDSAlergies.Eof do
        begin
          Allergy.AllergySubstanceClass[0].Identifier := CDSAlergiesNOALERGIA.Value;
          CDSAlergies.Next;
        end;
        if CDSPacientesSEXO.Value = 1 then
          Gender := GenderTypeEnum.Male
        else
          Gender := GenderTypeEnum.Female;

        D := TXSDate.Create;
        D.AsDate := CDSPacientesFECHANACIMIENTO.AsDateTime;
        DateOfBirth := D;
      end;
      With RequestedOperations do
      begin
        DrugToDrug := True;
        //DuplicateTherapy
        Allergy := True;

        With WarningLabels do
        begin
          Request := True;
          LanguageCode := 'en-US';
          MaxLines := 5;
          CharsPerLine := 24;
        end;
        With DoseScreening do
        begin
          Request := True;
        end;
        AdverseReactions.Request := True;
      end;
      IgnorePrescribed := False;
      IncludeConsumerNotes := True;
      IncludeProfessionalNotes := True;
    end;
  end;
end;*

Upvotes: 0

Views: 2385

Answers (1)

David Heffernan
David Heffernan

Reputation: 613441

Assuming that this line of code from the question is accurate:

Array_Of_ProductIdentifierClinicalType = array of ProductIdentifierClinicalType;

then the problem lies here:

Product := Array_Of_ProductIdentifierClinicalType.Create();

This is a dynamic array constructor. It creates a dynamic array of length equal to the number of parameters to the constructor. And then assigns each element of the array, in turn, to the parameters passed.

Consider an example using TBytes = array of Byte.

Bytes := TBytes.Create(1, 2, 3);

This initialises Bytes to be an array of length 3 and having values 1, 2 and 3.

Now, let's look at your code again. This initialises Product to be an array of length 0. So when you access Product[0] that results in a runtime error because the array index is out of bounds.

To solve the problem you will need to make sure that the array is initialised to have sufficient elements. One option is certainly to use a dynamic array constructor. Another is to use SetLength. I suspect that your understanding of Delphi's dynamic arrays is poor. I suggest that you consult the documentation.

Upvotes: 2

Related Questions