[Gelöst] Reporting Services: OptionCaptions statt integer

24. Juli 2008 13:54

Ich bastle gerade ein wenig an einem SQL Report.
Wenn ich ein Option-Feld einfüge, wird mir natürlich ein Integer angezeigt. Ich möchte aber die deutsche OptionCaption verwenden.

Bisher löse ich das so, dass ich in der Textbox mit einer Switch-Anweisung arbeite.
Wers braucht:
Code:
switch(OptionWert = 0, "Caption 1",
OptionWert = 2, "Caption 2")


Da ich das für jeden einzelnen Report wiederholen muss und mir diese Arbeit sparen will:
Wie kann ich auf dem SQL-Server eine entsprechende Abfrage o.ä. integrieren, sodass ich beim Einfügen des Feldes in meinen Report automatisch die OptionCaptions erhalte, also ohne switch im Report?

24. Juli 2008 14:07

tja im SQL sieht es dann z.B. so aus

Code:
select
No_ , case when Type =0 then 'nichts' when Type = 1 then 'Fibu' else 'Artikel' end as Type
from Sales_Line


irgendwie so

also, ich machs dann immer so...

24. Juli 2008 14:20

Danke, leider auch nicht das, was ich suche ...

Außerdem hätte ich da noch eine Frage:
Ich muss in jeder Zeile prüfen, ob eine bestimmte Bedingung zutrifft. Wenn ja, dann werden bestimmte Felder auf 0 zurück gesetzt. Dies muss auch in der Summe berücksichtigt werden.

Ich schaffe es zwar, dass die Table-Box mir den geänderten Wert anzeigt, jedoch manipuliere ich das eignetliche DataSet nicht, sodass die Summe zu hoch ist.
Gibt es eine Möglichkeit, Prozeduren oder so zu hinterlegen, die den DataSet-Wert (und nicht den Datensatz in der Datenbank!!) nach Abruf der Werte wirklich ändern?

24. Juli 2008 14:26

Oh, für Frage Nr. 2 komme ich glaub ich doch alleine weiter:
Verwenden von benutzerdefinierten Codeverweisen in Ausdrücken (Reporting Services)

Edit: Hilft mir für diesen Spezialfall anscheinen auch nicht weiter. Hat jemand eine Idee?

Re: Reporting Services: OptionCaptions statt integer ausgeben

4. August 2008 12:57

Hallo Natalie,

eine Lösung für das Problem fände ich gar nicht so uninteressant, da ich ebenfalls häufig SQL-Reports erstelle. Derzeit behelfe ich mir mit "CASE WHEN ... "-Anweisungen und pflege einen Stapel an Textdateien, in denen ich diese Anweisungen für die jeweiligen Tabellen in unseren Applikationssprachen vorrätig halte. Nicht schön, aber besser als jedes Mal neu schreiben.

Eine Möglichkeit, das Ganze etwas einfacher zu gestalten, wäre auf Datenbankebene eine Tabelle anzulegen, in der die Captions der Optionsfelder abgelegt werden. Ungefähr so:

TableID, FieldID, OpionValue, LanguageCode, OptionCaption

"Item", "Reserve", 0, "DEU", "Nie"
"Item", "Reserve", 0, "ENU", "Never"
"Item", "Reserve", 0, "PTG", "Nunca"

Mittels einer gespeicherten Prozedur wäre es nun möglich in einem SQL-Statement, die Caption eines bestimmten Optionswertes abzufragen.

Die Krux dabei: Wie bekomme ich die Captions der Optionsfelder in diese Tabelle geschrieben?

Da habe ich überhaupt keine Idee, da ich bislang nicht einmal weiß, wo die Captions in der SQL-Datenbank abgelegt werden. Aber vielleicht kennt sich hier jemand anders besser aus mit dem Thema?

Grüße,
Jens

Re: Reporting Services: OptionCaptions statt integer ausgeben

4. August 2008 13:29

j.r hat geschrieben:Die Krux dabei: Wie bekomme ich die Captions der Optionsfelder in diese Tabelle geschrieben?

Mit Boardmitteln erst einmal gar nicht. Denn:

Da habe ich überhaupt keine Idee, da ich bislang nicht einmal weiß, wo die Captions in der SQL-Datenbank abgelegt werden.

Wenn du in NAV eine Tabelle erstellst, oder auch nur ein Feld, einen Schlüssel ... dann wird dies automatisch auf dem SQL-Server mit angelegt. Dies gilt jedoch nicht für Captions, egal welcher Art. Übernommen werden nur die Namen.

Mittlerweile habe ich die Lösung mit der CASE-Anweisung "akzeptiert", von daher setz ich das Thema schon mal auf [Gelöst] ...

Re: [Gelöst] Reporting Services: OptionCaptions statt integer

4. August 2008 22:14

Um dann vielleicht doch die Lösung von j.r zu vervollständigen:

Code:
OBJECT Table 50100 Option Caption
{
  OBJECT-PROPERTIES
  {
    Date=04.07.08;
    Time=22:05:06;
    Modified=Yes;
    Version List=;
  }
  PROPERTIES
  {
  }
  FIELDS
  {
    { 10  ;   ;Table No.           ;Integer        }
    { 20  ;   ;Field No.           ;Integer        }
    { 30  ;   ;Option Value        ;Integer        }
    { 40  ;   ;Language Code       ;Code10         }
    { 100 ;   ;Table Name          ;Text30         }
    { 110 ;   ;Field Name          ;Text30         }
    { 120 ;   ;Option Name         ;Text60         }
    { 130 ;   ;Option Caption      ;Text60         }
  }
  KEYS
  {
    {    ;Table No.,Field No.,Option Value,Language Code;
                                                   Clustered=Yes }
    {    ;Table Name,Field Name,Option Value,Language Code }
  }
  CODE
  {

    PROCEDURE FillTable@1140000();
    VAR
      OptionCaption@1140008 : Record 50100;
      Field@1140000 : Record 2000000041;
      WindowsLanguage@1140015 : Record 2000000045;
      RecRef@1140006 : RecordRef;
      FldRef@1140007 : FieldRef;
      StatusDialog@1140001 : Dialog;
      TempText@1140012 : Text[1024];
      TempText2@1140013 : Text[1024];
      OptionStringArray@1140010 : ARRAY [100] OF Text[60];
      OptionCaptionArray@1140014 : ARRAY [100] OF Text[60];
      OldLangID@1140016 : Integer;
      Now@1140002 : Integer;
      Max@1140003 : Integer;

      c_StatusDialog@1140004 : TextConst
        'DEU=Fuelle Tabelle...\@1@@@@@@@@@@@@@@@@@@@@@@@@@@@@',
        'ENU=Filling table...\@1@@@@@@@@@@@@@@@@@@@@@@@@@@@@';

      c_ConfirmFillTable@1140005 : TextConst
        'DEU=Soll die Tabelle neu gefuellt werden?',
        'ENU=Refill table?';
      i@1140011 : Integer;
      NumOptions@1140009 : Integer;
    BEGIN
      IF NOT CONFIRM(c_ConfirmFillTable, FALSE) THEN
        EXIT;

      OptionCaption.RESET;
      OptionCaption.DELETEALL;

      OldLangID := GLOBALLANGUAGE;

      IF GUIALLOWED THEN BEGIN
        StatusDialog.OPEN(c_StatusDialog);
      END;


      WindowsLanguage.RESET;
      WindowsLanguage.SETRANGE("STX File Exist", TRUE);

      IF WindowsLanguage.FINDSET THEN REPEAT

        GLOBALLANGUAGE(WindowsLanguage."Language ID");

        Field.SETRANGE(TableNo, 0, DATABASE::Object - 1);

        Now := 0;
        Max := Field.COUNT;

        IF Field.FINDSET THEN REPEAT

          Now := Now + 1;

          IF Now MOD 50 = 0 THEN BEGIN
            StatusDialog.UPDATE(1, ROUND(Now / Max * 10000, 1));
          END;

          IF Field.Type = Field.Type::Option THEN BEGIN

            RecRef.OPEN(Field.TableNo);

            IF RecRef.FIELDEXIST(Field."No.") THEN BEGIN

              FldRef := RecRef.FIELD(Field."No.");

              TempText := FldRef.OPTIONSTRING;
              TempText2 := FldRef.OPTIONCAPTION;

              NumOptions := GetOptionArray(TempText, OptionStringArray);
              GetOptionArray(TempText2, OptionCaptionArray);

              FOR i := 1 TO NumOptions DO BEGIN

                CLEAR(OptionCaption);
                OptionCaption."Table No." := Field.TableNo;
                OptionCaption."Field No." := Field."No.";
                OptionCaption."Option Value" := i - 1;
                OptionCaption."Language Code" := WindowsLanguage."Abbreviated Name";

                OptionCaption."Table Name" := RecRef.NAME;
                OptionCaption."Field Name" := Field.FieldName;
                OptionCaption."Option Name" := OptionStringArray[i];
                OptionCaption."Option Caption" := OptionCaptionArray[i];

                OptionCaption.INSERT;

              END;

            END;

            RecRef.CLOSE();

          END;

        UNTIL Field.NEXT = 0;

      UNTIL WindowsLanguage.NEXT = 0;


      IF GUIALLOWED THEN BEGIN
        StatusDialog.CLOSE();
      END;

      GLOBALLANGUAGE(OldLangID);
    END;

    PROCEDURE GetOptionArray@1140002(OptionText@1140000 : Text[1024];VAR OptionArray@1140001 : ARRAY [100] OF Text[60]) : Integer;
    VAR
      Pos@1140002 : Integer;
      ArrayPos@1140003 : Integer;
    BEGIN
      ArrayPos := 0;

      REPEAT
        Pos := STRPOS(OptionText, ',');

        IF Pos > 0 THEN BEGIN
          ArrayPos := ArrayPos + 1;
          OptionArray[ArrayPos] := COPYSTR(OptionText, 1, Pos - 1);
          OptionText := COPYSTR(OptionText, Pos + 1);
        END;
      UNTIL Pos <= 0;

      ArrayPos := ArrayPos + 1;
      OptionArray[ArrayPos] := OptionText;

      EXIT(ArrayPos);
    END;

    BEGIN
    END.
  }
}


Die Funktion FillTable() innerhalb der Tabelle füllt diese mit den Optionsnamen und -captions der jeweils aktiven Sprachen. Die Funktion muss nach Optionsänderungen einmalig aufgerufen werden und läuft je nach Menge der Sprachen einige Sekunden.

Danach kann man über z. B. eine gespeicherte Prozedur die Caption abgreifen und auf dem SQL Server benutzen.

Re: [Gelöst] Reporting Services: OptionCaptions statt integer

5. August 2008 15:58

Hallo Carsten,

wow, ich bin total begeistert!!! Ich hätte ja mit allem gerechnet, aber nicht mit solch einer fertigen Lösung!

Werde ich gleich morgen ausprobieren und anschließend von meinen Erfahrungen berichten.

Schon mal vielen Dank vorab :-D

Grüße,
Jens