Seite 1 von 1

Com-Schnittstelle CoClass?

Verfasst: Do, 08. Mai 2014 10:39
von mini990
Hallo,
bei einem ActiveX-Objekt (COM-Schnittstelle) muss ein zweites Objekt als "CoClass" angelegt werden.
Geht das mit Xbase?
Danke im Voraus.

Gruß Stefan

Re: Com-Schnittstelle CoClass?

Verfasst: Do, 08. Mai 2014 16:58
von AUGE_OHR
hi,

meinst du damit das ein activeX Object einer Property eines anderen activeX Object zugeordnet werden soll ?

Code: Alles auswählen

   oAAA := CreateObject( "AAA...." )
   ...
   oBBB := CreateObject( "BBB...." )
   ...
   oAAA:MyProperty := oBBB       // DAS geht NICHT mit Xbase++

Re: Com-Schnittstelle CoClass?

Verfasst: Fr, 09. Mai 2014 8:01
von mini990
Hmmmm....
Sowas soll ich umsetzen:

Code: Alles auswählen

$appobj = new-object -comobject praxisCENTER3.ApplicationObject
$appobj.SetMode('MultiplePatient', '1')

# get Physician
$physician = $appobj.Physician

$physician.LANR="123456789"
$physician.BSNR="821234567"
$physician.Title="Dr"
$physician.FirstName="Hans"
$physician.LastName="Maier"
$physician.PostalCode="81369"
$physician.Activate()

# get Patients 
$patients = $appobj.Patients
$patients.Clear()
$patients.Count
 
# add new patient
$pat1 = new-object -comobject praxiscenter3.patient
$patients.add($pat1)
$pat1.ID = "45678"
$pat1.IKId = "108377503"
$pat1.InsuredMemberId = "123456789"
$pat1.FirstName = "Max"
$pat1.LastName = "Mayer2"
$pat1.City = "Berlin"
$pat1.PostalCode = "80337"
$pat1.Street = "Parkstrasse"
$pat1.No = "6"
$pat1.Pregnancy = 0
$pat1.Height = 196
$pat1.Birthday = "07.09.1981"
$pat1.Sex = 0

# get prescription collection
$prescription = $pat1.Prescription
$prescription.Clear()

# add new prescription item
# erfolgt in ipc
#$presMed = new-object -comobject praxiscenter3.PrescriptionMedicament
#$presMed.NecAutIdem=1
#$presMed.Count=4
#$presMed.PIC=780908
#$presMed.PrintName="xyz_PrintName2"
#$presMed.NewPrescription=1
#$presMed.Dosage.Morning = 3
#$presMed.SelectedPrescriptionType = 1
#$prescription.Add($presMed)
#$prescription.Activate()

# aktivate patient
$pat1.Activate()
# aktivate App/Session
$appobj.Activate()

$appobj.Show()


# Rezeptieren
# ALT + F9

$med = new-object -comobject praxisCENTER3.Medicament
foreach ($presMed in $prescription)
{
	# $presMed.PIC

	$appobj.GetMedicament($presMed.PIC,[ref]$med)
	# Ausgabe der Eigenschaften in der Console
	$med.PIC
	$med.narcoticaddition
	$med.Homeopathic

}
#$prescription.Count
#$presMed = $prescription.Item(0)
#$presMed.PIC


$appobj.Hide()
$appobj.Close()
... und da gibt's keine Chance mit Xbase?

Gruß Stefan

Re: Com-Schnittstelle CoClass?

Verfasst: Fr, 09. Mai 2014 18:37
von AUGE_OHR
mini990 hat geschrieben:

Code: Alles auswählen

$patients.add($pat1)    // -> hier
...
#$prescription.Add($presMed) // und hier
... und da gibt's keine Chance mit Xbase?
ausprobieren ...
ein (mögliches) Problem sehe ich beim ".ADD" da man hier ein Object (mit Eigenschaften) einem anderen Object zufügen möchte.

Re: Com-Schnittstelle CoClass?

Verfasst: Sa, 10. Mai 2014 7:39
von mini990
mit dem adden gibt es kein Problem.
Das funktioniert soweit. Ich kann auch die Werte abfragen.
Wo ich nicht weiterkomme ist hier:

Code: Alles auswählen

$med = new-object -comobject praxisCENTER3.Medicament
foreach ($presMed in $prescription)
{
   # $presMed.PIC

   $appobj.GetMedicament($presMed.PIC,[ref]$med)
Bei diesem getmedicament ..... bekomme ich immer leere Werte zurück.

Re: Com-Schnittstelle CoClass?

Verfasst: Sa, 10. Mai 2014 18:09
von AUGE_OHR
hi,

für die FOREACH Kombination kannst du das versuchen

Code: Alles auswählen

   bCollBlock     := {|oService,n| AADD(aItem,{ n,;
     oService:getProperty("PIC"),;
     oService:getProperty("narcoticaddition"),;
     oService:getProperty("Homeopathic") })}

   ComEvalCollection(prescription, bCollBlock )

   IF LEN(aItem) > 0
       // auswerten
   ENDIF

Re: Com-Schnittstelle CoClass?

Verfasst: Di, 13. Mai 2014 9:49
von mini990
Hier mal der Quellcode....

Code: Alles auswählen

// AutomationObjekt
oIfap := CreateObject("PraxisCENTER3.ApplicationObject")
oIfap := oIfap:dynamicCast ( ActiveXObject() )
...
...
oIfAp:OnPrescription := { |x| FOnPrescript(x) }


STATIC FUNCTION FOnPrescript (x)
aMedi := AClone ({})
  
// IfAp-PC verstecken
oIfap:Hide()
 
oMed := CreateObject("PraxisCENTER3.Medicament")

// Presciption --> aMedi
IF oPat:Prescription:Count > 0

   for i:=0 to oPat:Prescription:Count-1
			oMedic := oPat:Prescription:Item(i)
      // Daten des Medikamentes in Array ablegen
      cPZN := padl(alltrim(ntoc(oMedic:PIC)), 7, "0")

			oifap:GetMedicament(cPZN, oMed)

      nAVP := val(strtran(ntoc(oMed:Pharmacyprice), ",", "."))
      aadd(aMedi,{cZ1, cZ2, cPZN, nAVP, oMed:DosageForm, allTrim(oMed:Quantity)+" "+allTrim(oMed:QuantityOfUnit), cSort, cDosi, nAnz})
      
			? cPZN
			? nAVP      
   next i
   use
ENDIF
oPat:Prescription:Clear()
lPrescription := .T.
RETURN (.T.)
Ich kann alle Werte des Objekts oMedic auswerten, hier stimmen die Inhalte.
Auch die for-next Schleife wird korrekt abgearbeitet.

Probleme bereitet diese Zeile:
oifap:GetMedicament(cPZN, oMed)
Hier erscheint die Fehlermeldung:
  • Xbase++ Version : Xbase++ (R) Version 1.90.355
    Betriebssystem : Windows Vista 06.01 Build 07601 Service Pack 1
    ------------------------------------------------------------------------------
    oError:args :
    -> VALTYPE: C VALUE: GetMedicament
    -> VALTYPE: C VALUE: 1020081
    -> VALTYPE: O CLASS: AutomationObject
    oError:canDefault : J
    oError:canRetry : N
    oError:canSubstitute: J
    oError:cargo : NIL
    oError:description : Falscher Variablentyp.
    Parameter hat falschen Wert
    oError:filename : NIL
    oError:genCode : NIL
    oError:operation : GetMedicament
    oError:osCode : -2147352568
    oError:severity : 2
    oError:subCode : 6500
    oError:subSystem : Automation
    oError:thread : 1
    oError:tries : NIL
    ------------------------------------------------------------------------------
    CALLSTACK:
    ------------------------------------------------------------------------------
Bin langsam am verzweifeln....

Gruß Stefan

Re: Com-Schnittstelle CoClass?

Verfasst: Di, 13. Mai 2014 10:41
von Wolfgang Ciriack
Hast du mal versucht, das Object per Reference zu übergeben ?

Code: Alles auswählen

oifap:GetMedicament(cPZN, @oMed)

Re: Com-Schnittstelle CoClass?

Verfasst: Di, 13. Mai 2014 17:16
von mini990
hatte ich schon probiert, gleiches Ergebnis.
Trotzdem Danke...

Gruß Stefan

Re: Com-Schnittstelle CoClass?

Verfasst: Di, 13. Mai 2014 19:52
von AUGE_OHR
mini990 hat geschrieben:Hier mal der Quellcode....

Code: Alles auswählen

oIfap := oIfap:dynamicCast ( ActiveXObject() ) 
...
oIfAp:OnPrescription := { |x| FOnPrescript(x) }


   for i:=0 to oPat:Prescription:Count-1
			oMedic := oPat:Prescription:Item(i)
      // Daten des Medikamentes in Array ablegen
      cPZN := padl(alltrim(ntoc(oMedic:PIC)), 7, "0")

			oifap:GetMedicament(cPZN, oMed)
hi,
ein

Code: Alles auswählen

oIfap:dynamicCast ( ActiveXObject() )
benötigtst du nur wenn das activeX Events sendet die du mit

Code: Alles auswählen

o:subscribeEvent("Name_of_Event")
abfangen willst.
mit scheint als wenn "oIfAp:OnPrescription" ein solcher Event ist, oder ?

zu der Method

Code: Alles auswählen

oifap:GetMedicament(cPZN, oMed)
ich bin mir hier nicht sicher ob "oMed" ein Object oder eine Structur sein müsste.
grob gesagt suchst du in einer "Menge" ($prescription) wobei ein Object / Structur ($med) die Ergebnisse enthalten soll.

dabei verwendest du, in der Schleife, immer wieder das selbe Object was du "füllen" möchtest... hm
dies ähnelt dem Problem in WMI wo dafür ComEvalCollection() verwendet wird welches das Object als Parameter, im Codeblock

Code: Alles auswählen

 {|oService, n| ...}
zurück gibt.
oError:description : Falscher Variablentyp.
ich tippe eher auf den ersten Parameter denn

Code: Alles auswählen

#$presMed.PIC=780908
ist ja wohl numerisch !

Re: Com-Schnittstelle CoClass?

Verfasst: Mi, 14. Mai 2014 4:14
von AUGE_OHR
mini990 hat geschrieben:

Code: Alles auswählen

$med = new-object -comobject praxisCENTER3.Medicament
foreach ($presMed in $prescription)
{
   # $presMed.PIC

   $appobj.GetMedicament($presMed.PIC,[ref]$med)
ich sehe gerade das [ref] ...
mit Referenz auf ein Object könnte ein numerischer Pointer gemeint sein ( wo ich die Structur finde )

Code: Alles auswählen

oifap:GetMedicament(nPZN, oMed:interface)

Re: Com-Schnittstelle CoClass?

Verfasst: Mo, 19. Mai 2014 9:04
von mini990
Habe diese Beschreibung für den Aufruf gefunden:

Function GetMedicament (Value: WideString, var Medicament: IMedicament): Integer;

Parameter: Value PZN des Medikaments oder StarCode [out] Medicament Ein Medicament-Objekt,
welches nach dem Funktionsaufruf das Ergebnis beinhaltet.
Das Objekt muss vor dem Funktionsaufruf als CoClass angelegt werden.

Bin ehrlich: ich verstehe es nicht...

Gruß Stefan

Re: Com-Schnittstelle CoClass?

Verfasst: Mo, 19. Mai 2014 13:55
von AUGE_OHR
mini990 hat geschrieben:Function GetMedicament (Value: WideString, var Medicament: IMedicament): Integer;
hm ...
ein WideString hört sich nach String an ABER vorher im Source wurde ein numerischer Wert zugewiesen ?!
mit o:Interface bekommst du einen numerischen Wert.