+1 800 256 3608 (toll-free in North America) or +49 7531 90 60 10| service@combit.com

Was ist das List & Label Job-Handle?

net
(Armando Morelli) #1

Ich lerne das Programmierhandbuch und insbesondere Kapitel 6: “API Referenz”. In diesem Zusammenhang möchte ich fragen: Wie wird das HLLJOB-Objekt erstellt und was stellt es dar?

ZB: HLLJOB hJob = LlJobOpen (CMBTLANG_GERMAN);

Diagrammart dynamische Änderung
(combit - Jochen Bartlau) #2

Wenn Sie mit einer unserer Komponenten arbeiten brauchen Sie sich mit dem Jobhandle nicht zu beschäftigen, da das Handling komplett im Hintergrund für Sie übernommen wird. Ansonsten ist dieses Handle der Schlüssel zu allen anderen API-Aufrufen und muss dort als erster Parameter übergeben werden.

In .NET stehen Ihnen die ganzen API-Funktionen innerhalb des Core-Unterobjekts zur Verfügung und können dort ohne das Jobhandle genutzt werden.

(Armando Morelli) #3

Vielen Dank für Ihre Klarstellung.

Auf diese Weise konnte ich auf Berichtsobjekte zugreifen.

     ProjectList proj = new ProjectList(_ll);
     proj.Open(_fileName, LlDomFileMode.OpenOrCreate, LlDomAccessMode.ReadWrite);

Wenn ich jedoch versuche, ein Objekt zu ändern, wird ein Fehler angezeigt, weil es schreibgeschützt ist (siehe letzte Zeile).

     foreach(ObjectText item in proj.Objects) {
        switch(item.Name) {
           case "txtTitle1":
              item.Paragraphs[0].Contents = "ci";

Von dem, was Sie mir erzählen, wäre es nicht richtig, es so zu öffnen.
Wäre es also richtig, Berichtsobjekte auf diese Weise über DOM zu kriegen?

   private ListLabel _ll = new ListLabel ();
     LlCore _domReport = new LlCore(_ll);
     _domReport.LlProjectOpen(LlProject.List, _fileName, int Flags ?);

Zeigt der letzte Parameter (Flags) die Zugriffsebene an?
Wo kann ich sehen, wie ich es an meine Bedürfnisse einrichten kann? ZB Readwrite .

Im Programmierhandbuch jeden Hinweis auf die LlProjectOpen-Funktion meldet dies:

LlProjectOpen(hJob,LL_PROJECT_LIST,“c:\simple.lst”, LL_PRJOPEN_CD_CREATE_ALWAYS | LL_PRJOPEN_AM_READWRITE);

(combit - Jochen Bartlau) #4

Welchen Fehler erhalten Sie denn genau beim Speichern? Sie sollten unter .NET wie in Ihrem ersten Snippet zu sehen mit der ProjectList-Klasse arbeiten und nicht direkt mit LlProjectOpen arbeiten, da Ihnen dann das gesamte Handling abgenommen wird. An sich sieht Ihr Code gut aus, vielleicht könnten Sie einmal ein Logfile hier einstellen? Einzig

item.Paragraphs[0].Contents = "ci";

könnte unerwarteterweise nicht funktionieren, da Sie hier den Inhalt des Absatzes als Formel setzen müssen. Wenn es also kein Feld “ci” gibt, sollte die Zeile besser

item.Paragraphs[0].Contents = "'ci'";

lauten (mit Anführungszeichen um das ci) um dort einen simplen Text auszugeben. Ansonsten müssen Sie darauf achten, dass die korrekte Datenquelle an Ihrem _ll-Objekt hängt oder - als weitere Idee - den optionalen vierten Parameter der Open-Methode nutzen, um Syntaxfehler zu ignorieren. Spätestens zur Druckzeit müssen aber alle Formeln korrekt und auflösbar sein.

(Armando Morelli) #5

In der Tat war der Fehler auf fehlende Anführungszeichen zurückzuführen.
Ich konnte auf die Textobjekte des Berichts zugreifen.

Ich habe noch eine andere Frage: Wie Anforderung muss ich die Art des Diagramms ändern (zB von Balken zu Linien) und das Feld für die Y-Achse über die DOM-API dynamisch zuweisen.
Hier habe ich immer noch Schwierigkeiten, auf diese Art von Objekten zuzugreifen.
Der folgende Code (die beiden if-else-Bedingungen) kann das Diagramm im Bericht nicht finden.

  private void Test() {
     ProjectList proj = new ProjectList(_ll);
     proj.Open(_fileName, LlDomFileMode.OpenOrCreate, LlDomAccessMode.ReadWrite);
     try {
        foreach(ObjectBase item in proj.Objects) {
           if(item is ObjectText) {
              ObjectText ot = (ObjectText)item;
              switch(item.Name) {
                 case "txtTitle1":

                    ot.Paragraphs[0].Contents = "'ci'";
                    break;
                 case "txtTitle2":
                    ot.Paragraphs[0].Contents = "'ao'";
                    break;
              }
           }
           else if(item is ObjectReportContainer) {  
                 if(item is ObjectChart) {
                    ObjectChart oc = (ObjectChart)item;
                 }
           }
           else if(item is ObjectChart) {
              ObjectChart chart = (ObjectChart)item;

           }
        }
     }
     catch(ListLabelException ex) {
        MessageBox.Show(ex.Message);
     }
     finally {
        proj.Save();
        proj.Close();
        proj.Dispose();
     }
  }

Ich möchte die Protokolldatei einstellen, weiß aber immer noch nicht, wie das geht.

Nochmals vielen Dank für die schnelle Unterstützung.

(combit - Jochen Bartlau) #6

Sie müssen lediglich Debwin4.exe starten und die entsprechende Schaltfläche betätigen.

Zu Ihrer Frage jetzt - ich denke, es fehlt das loopen durch die Unterobjekte des Berichtscontainers. In Ihrer Abfrage oben ist item ja schon vom Typ ObjectReportContainer, es kann nicht gleichzeitig ein ObjectChart sein. Vielmehr müssen Sie die Eigenschaft SubItems des Containers beachten und dort nah einem SubItemChart suchen. In etwa so:

private void Test() {
     ProjectList proj = new ProjectList(_ll);
     proj.Open(_fileName, LlDomFileMode.OpenOrCreate, LlDomAccessMode.ReadWrite);
     try {
        foreach(ObjectBase item in proj.Objects) {
   ...
        else if(item is ObjectReportContainer) {  
              foreach (SubItemBase subItem in (item as ObjectReportContainer).SubItems)
                 {
                 if(subItem is SubItemChart) {
                    SubItemChart oc = (SubItemChart)item;
                 }
           }
...
1 Like
(Armando Morelli) #7

Sobald dieses Problem gelöst ist, widme ich mich gerne dafür, danke.

Echt, das Diagramm ist ein Unterelement des ObjectReportContainer-Objekts.

Ich sehe jedoch keine Eigenschaft, durch die der Typ des Diagramms definiert werden kann, oder die Eigenschaft für das Feld, das der Achse zugewiesen werden soll

SubItemChart oc = (SubItemChart)subItem;
Imaginärer Code
oc.XAchse = myField;
oc.Diagrammart = “Linien”;