Kundendisplay Ansteuerung in NAV oder C# - import einer Form

9. August 2016 12:55

Hallo liebe community.

Ich habe wieder kurzfristig ein POS System zur Verfügung und nämlich ein HP RP7800 Retail System und ein HP Retail Integrated 2x20 Display(G6U79AA). Wollte jetzt bisschen damit tüfteln und habe das gefunden.
http://engelhuber.de/blog/2013/02/04/na ... -ansteuern
Der Autor hat sogar die Objekte zugänglich gemacht, aber die sind von der alten Version (eine Form) und ich versuche es jetzt zu integrieren (Page), aber meine fehlenden Kentnisse sind mein Hindernis.

Geht es eigentlich sowas in NAV 2016 zu bauen? (vergleiche eine Form von Visual Studio mit Buttons, TextBoxes etc). Ich habe versucht die Sachen von der txt/fob Datei manuell zu importieren aber versagt, da ich nichht genau weiß , was ich mit "Controls" machen sollte. Auch WSH Automation ist ein Geheimnis für mich.

Die F50000 Display Test.txt Datei von dem Link oben (EngelHubert.de), damit ihr es nicht herunterladen müsst.
Code:
OBJECT Page 50000 Display Test
{
  OBJECT-PROPERTIES
  {
    Date=04.02.13;
    Time=09:49:12;
    Modified=Yes;
    Version List=;
  }
  PROPERTIES
  {
    Width=8910;
    Height=3520;
    SourceTable=Table18;
    DelayedInsert=Yes;
    SourceTableTemporary=Yes;
    OnOpenForm=BEGIN
                 Zeile1 := 'Hallo Welt !!';
                 Zeile2 := 'Zweite Zeile....';
                 TmpPfad := 'C:\Windows\Temp\POSDispOut.dat';
               END;

  }
  CONTROLS
  {
    { 1000000000;CommandButton;3520;2750;2200;550;
                                                 CaptionML=DEU=Ausgabe;
                                                 OnPush=BEGIN
                                                          Zeilenumbruch := 10; // Umbruch fr Display
                                                          AllesL”schen := 26; // alles auf dem Display l”schen
                                                          Zeilenanfang := 13; // Cursor am Anfang der Zeile positionieren

                                                          Datei.CREATE(TmpPfad);
                                                          Datei.OPEN(TmpPfad);
                                                          Datei.TEXTMODE(FALSE);

                                                          Datei.WRITE(AllesL”schen);
                                                          Datei.WRITE(FORMAT(Zeile1)); // erste Zeile ausgeben
                                                          Datei.WRITE(Zeilenumbruch);
                                                          Datei.WRITE(Zeilenanfang);
                                                          Datei.WRITE(FORMAT(Zeile2)); // zweite Zeile ausgeben

                                                          Datei.CLOSE;

                                                          CREATE(WSH);
                                                          WSH.Exec('cmd.exe /Q /C type ' + TmpPfad + ' > ' + FORMAT(ComPort));
                                                          CLEAR(WSH);
                                                        END;
                                                         }
    { 1000000001;TextBox;3630 ;220  ;2750 ;440  ;SourceExpr=Zeile1 }
    { 1000000002;TextBox;3630 ;770  ;2750 ;440  ;SourceExpr=Zeile2 }
    { 1000000003;TextBox;3630 ;1540 ;1700 ;440  ;SourceExpr=ComPort }
    { 1000000004;TextBox;3630 ;2090 ;5060 ;440  ;SourceExpr=TmpPfad }
    { 1000000005;Label  ;220  ;2090 ;3300 ;440  ;CaptionML=DEU=Temp. Pfad }
    { 1000000006;Label  ;220  ;1540 ;3300 ;440  ;CaptionML=DEU=COM Port }
    { 1000000007;Label  ;220  ;220  ;3300 ;440  ;CaptionML=DEU=Zeile 1 }
    { 1000000008;Label  ;220  ;770  ;3300 ;440  ;CaptionML=DEU=Zeile 2 }
  }
  CODE
  {
    VAR
      Zeile1@1000000000 : Text[20];
      Zeile2@1000000001 : Text[20];
      Datei@1000000002 : File;
      WSH@1000000003 : Automation "{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B} 1.0:{72C24DD5-D70A-438B-8A42-98424B88AFB8}:'Windows Script Host Object Model'.WshShell";
      Zeilenumbruch@1000000004 : Char;
      AllesL”schen@1000000005 : Char;
      Zeilenanfang@1000000006 : Char;
      ComPort@1000000007 : 'COM1,COM2,COM3,COM4';
      TmpPfad@1000000008 : Text[250];

    BEGIN
    END.
  }
}



Er macht es über Windows Scripting Host und leitet die Eingabe an den COM Port weiter. Über cmd oder kleine C# Anwendungen ging es bei mir, etwas auf dem Display anzuzeigen, auch über TestTools von OPOS(Display funktioniert richtig). Ich weiß aber nicht wirklich, wie ich die Steuerzeichen verwende in NAV oder C#(Alles loeschen usw.) Zeilenumbruch und Line Feed habe ich in C# durch
Code:
private voide brn_SendTest_Click(object sender, EventARgs e)
{
COM3.WriteLine("Test\r\n");  oder COM3.WriteLine(textBox1.Text + "\n\);
}

Die Steuerzeichen für das Display habe ich hier: (Seite 8)
http://h10032.www1.hp.com/ctg/Manual/c05039618

Da ich eigentlich in C# niemals programiert habe und es nur hobbymäßig gemacht, kann ich die Steuerzeichen leider nicht anwenden.
Auch mit PoS for .Net 1.14 tue ich mich schwer. Leider habe ich das PoS System nicht für immer und kann damit nicht lange tüfteln.

Danke für die Aufmerksamkeit.
Zuletzt geändert von marcussulic am 9. August 2016 13:37, insgesamt 1-mal geändert.

Re: Kundendisplay Ansteuerung in NAV oder C# - import einer

9. August 2016 13:11

Hi,

ich stelle mich mal wieder etwas dümmlich bei der Suche nach der eigentl. Frage an :)

Was ist denn jetzt genau deine Herausforderung?
marcussulic hat geschrieben:Geht es eigentlich sowas in NAV 2016 zu bauen?

ja -> hast du ja selbst in deinem Bsp gemacht....oder geht das Beispiel nicht? ---> sofern es nicht geht, dann die Frage, was nicht geht
marcussulic hat geschrieben:Ich weiß aber nicht wirklich, wie ich die Steuerzeichen verwende in NAV

so wie du es in deinem Beispiel bereits getan hast
Code:
Datei.WRITE(AllesL”schen); <<<<<<<<<<<<<<eines deiner Steuerzeichen
Datei.WRITE(FORMAT(Zeile1)); // erste Zeile ausgeben
Datei.WRITE(Zeilenumbruch);<<<<<<<<<<<<<<noch eines deiner Steuerzeichen


Deine Steuerzeichen wurden ja hier definiert:
Code:
                                                          Zeilenumbruch := 10; // Umbruch fr Display
                                                          AllesL”schen := 26; // alles auf dem Display l”schen
                                                          Zeilenanfang := 13; // Cursor am Anfang der Zeile positionieren

Re: Kundendisplay Ansteuerung in NAV oder C# - import einer

9. August 2016 14:20

Sorry, ich habe es nicht genau spezifiziert, dass der Code aus dem Beispiel von dieser Seite kommt: http://engelhuber.de/blog/2013/02/04/na ... ansteuern/.
Er benutzte ein Glacetronmit seinen Steuerzeichen. Ich verwende ein HP Integrated 2x20 mit Steuerzeichen hier: http://h10032.www1.hp.com/ctg/Manual/c05039618 bei mir sind die Steuerzeichen komplexer also ist zum Beispiel sowas richtig?
Code:
Alles loeschen := 1B 40 ; //Alles auf dem Display löschen

oder wie macht man es mit mehreren Zahlen

Er hat die Objekte zum Herunterladen zur Verfügung gestellt In diesem Archiv: F50000_Navision_POS_Display.rar sind eine fob und eine txt Datei drin. Der Code stammt von der txt Datei (die fob kann ich nicht importieren weil es in NAV 2016 keine Forms gibt. Kann man im Object:Page TextBoxes, Buttons etc hinzufügen? Die gibts nämlich in der Beispielform als Controllers und ich weiß nicht ob das kompatibell ist. Außerdem es gibt Properties Width, Height die beim Importieren fehlerschlagen. (Zeile12 glaube ich)
Properties.Width.PNG

Loeschen dürfte man eslogischerweise nicht, da alle die Labels und TextBoxes bestimmte xy Lokation haben oder? bsp:
Code:
{ 1000000001;TextBox;3630 ;220  ;2750 ;440  ;SourceExpr=Zeile1 }

Wenn man sie doch aus Langweile löscht dann mekert er in Zeile 24
Controller Indent.PNG
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: Kundendisplay Ansteuerung in NAV oder C# - import einer

9. August 2016 15:45

ahh - ok jetzt verstehe ich :)

am besten du legst dir eine eigene Page an - nicht einfach die *.txt der Form so modifizieren, dass anstatt <<Form>> <<Page>> steht :)

Steuerzeichen ggf, so (also mit den einfachen Anführungszeichen):
Code:
Alles loeschen := '1B 40' ; //Alles auf dem Display löschen


marcussulic hat geschrieben:Kann man im Object:Page TextBoxes, Buttons etc hinzufügen?

Du kannst natürlich in Pages soetwas wie Textboxen und Buttons hinzufügen....es gibt genug Hilfestellungnen bei google, sodass ich hier garnicht näher darauf eingehen will ----> nur ein Hinweis, lass dich nicht vom Type "Field" verwirren -> es muss nicht zwingend ein Feld einer Tabelle sein.

Re: Kundendisplay Ansteuerung in NAV oder C# - import einer

9. August 2016 16:25

Bei der Miniform geht es sicherlich auch ohne, aber zur Info wie es ggf. zu konvertieren wäre, habe ich die Beispielform in das XML-Format umgewandelt (das gibt es bei NAV 2009 als Exportoption, ausschliesslich zu Konvertierungszwecken), damit kann man Forms (soweit machbar :roll: ) in Pages konvertieren.

Transforming Forms to Pages
Form Transformation Tool Overview
Die notwendigen Tools dazu:
Microsoft Dynamics NAV 2009 Developer Tools

marcussulic hat geschrieben:Außerdem es gibt Properties Width, Height die beim Importieren fehlerschlagen.

Unabhängig davon (wie schon angemerkt), dass man Forms nicht als Pages importieren darf, gibt es die in Pages auch gar nicht mehr.

Code:
<?xml version="1.0"?>
<Objects xmlns="urn:schemas-microsoft-com:dynamics:NAV:ApplicationObjects"><Form xmlns="urn:schemas-microsoft-com:dynamics:NAV:ApplicationObjects" ID="50000" Name="Display Test" Date="2013-02-04" Time="07:49:12Z" VersionList=""><Properties><Width>8910</Width><Height>3520</Height><SourceTable>Table18</SourceTable><DelayedInsert>Yes</DelayedInsert><SourceTableTemporary>Yes</SourceTableTemporary></Properties><Triggers><OnOpenForm><![CDATA[BEGIN
  Zeile1 := 'Hallo Welt !!';
  Zeile2 := 'Zweite Zeile....';
  TmpPfad := 'C:\Windows\Temp\POSDispOut.dat';
END;
]]></OnOpenForm></Triggers><Controls><Control><Properties><ID>1000000000</ID><Controltype>CommandButton</Controltype><XPos>3520</XPos><YPos>2750</YPos><Width>2200</Width><Height>550</Height><CaptionML>DEU=Ausgabe</CaptionML></Properties><Triggers><OnPush><![CDATA[BEGIN
  Zeilenumbruch := 10; // Umbruch für Display
  AllesLöschen := 26; // alles auf dem Display löschen
  Zeilenanfang := 13; // Cursor am Anfang der Zeile positionieren

  Datei.CREATE(TmpPfad);
  Datei.OPEN(TmpPfad);
  Datei.TEXTMODE(FALSE);

  Datei.WRITE(AllesLöschen);
  Datei.WRITE(FORMAT(Zeile1)); // erste Zeile ausgeben
  Datei.WRITE(Zeilenumbruch);
  Datei.WRITE(Zeilenanfang);
  Datei.WRITE(FORMAT(Zeile2)); // zweite Zeile ausgeben

  Datei.CLOSE;

  CREATE(WSH);
  WSH.Exec('cmd.exe /Q /C type ' + TmpPfad + ' > ' + FORMAT(ComPort));
  CLEAR(WSH);
END;
]]></OnPush></Triggers></Control><Control><Properties><ID>1000000001</ID><Controltype>TextBox</Controltype><XPos>3630</XPos><YPos>220</YPos><Width>2750</Width><Height>440</Height><SourceExpr>Zeile1</SourceExpr></Properties></Control><Control><Properties><ID>1000000002</ID><Controltype>TextBox</Controltype><XPos>3630</XPos><YPos>770</YPos><Width>2750</Width><Height>440</Height><SourceExpr>Zeile2</SourceExpr></Properties></Control><Control><Properties><ID>1000000003</ID><Controltype>TextBox</Controltype><XPos>3630</XPos><YPos>1540</YPos><Width>1700</Width><Height>440</Height><SourceExpr>ComPort</SourceExpr></Properties></Control><Control><Properties><ID>1000000004</ID><Controltype>TextBox</Controltype><XPos>3630</XPos><YPos>2090</YPos><Width>5060</Width><Height>440</Height><SourceExpr>TmpPfad</SourceExpr></Properties></Control><Control><Properties><ID>1000000005</ID><Controltype>Label</Controltype><XPos>220</XPos><YPos>2090</YPos><Width>3300</Width><Height>440</Height><CaptionML>DEU=Temp. Pfad</CaptionML></Properties></Control><Control><Properties><ID>1000000006</ID><Controltype>Label</Controltype><XPos>220</XPos><YPos>1540</YPos><Width>3300</Width><Height>440</Height><CaptionML>DEU=COM Port</CaptionML></Properties></Control><Control><Properties><ID>1000000007</ID><Controltype>Label</Controltype><XPos>220</XPos><YPos>220</YPos><Width>3300</Width><Height>440</Height><CaptionML>DEU=Zeile 1</CaptionML></Properties></Control><Control><Properties><ID>1000000008</ID><Controltype>Label</Controltype><XPos>220</XPos><YPos>770</YPos><Width>3300</Width><Height>440</Height><CaptionML>DEU=Zeile 2</CaptionML></Properties></Control></Controls><Code><![CDATA[VAR
  Zeile1@1000000000 : Text[20];
  Zeile2@1000000001 : Text[20];
  Datei@1000000002 : File;
  WSH@1000000003 : Automation "{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B} 1.0:{72C24DD5-D70A-438B-8A42-98424B88AFB8}:'Windows Script Host Object Model'.WshShell";
  Zeilenumbruch@1000000004 : Char;
  AllesLöschen@1000000005 : Char;
  Zeilenanfang@1000000006 : Char;
  ComPort@1000000007 : 'COM1,COM2,COM3,COM4';
  TmpPfad@1000000008 : Text[250];

BEGIN
END.
]]></Code></Form></Objects>
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: Kundendisplay Ansteuerung in NAV oder C# - import einer

9. August 2016 18:11

Kowa hat geschrieben:Bei der Miniform geht es sicherlich auch ohne, aber zur Info wie es ggf. zu konvertieren wäre, habe ich die Beispielform in das XML-Format umgewandelt (das gibt es bei NAV 2009 als Exportoption, ausschliesslich zu Konvertierungszwecken), damit kann man Forms (soweit machbar :roll: ) in Pages konvertieren.
...

Danke dafür. Das war mein erster Anhaltspunkt und ich fand es schon bisschen kompliziert und wusste noch nicht ob ich als Anfänger damit tüfteln möchte. Ich werde sie mir durchlesen und durchprobieren sobald ich genung Zeit habe.

sweikelt hat geschrieben:ahh - ok jetzt verstehe ich :)

am besten du legst dir eine eigene Page an - nicht einfach die *.txt der Form so modifizieren, dass anstatt <<Form>> <<Page>> steht :)

Steuerzeichen ggf, so (also mit den einfachen Anführungszeichen):
Code:
Alles loeschen := '1B 40' ; //Alles auf dem Display löschen


marcussulic hat geschrieben:Kann man im Object:Page TextBoxes, Buttons etc hinzufügen?

Du kannst natürlich in Pages soetwas wie Textboxen und Buttons hinzufügen....es gibt genug Hilfestellungnen bei google, sodass ich hier garnicht näher darauf eingehen will ----> nur ein Hinweis, lass dich nicht vom Type "Field" verwirren -> es muss nicht zwingend ein Feld einer Tabelle sein.


Ich habe angefangen, indem ich eine engene Page angelegt habe :) dann habe ich es erst mit der *.txt rumgespielt.

Ich war nur unsicher wie ich bestimmte Teile der Beispielform in meine Page integriere, nach einiger Zeit hat sich aber schon manches geklärt. Nun muss ich mir noch ansehen wie man in einer Page Elemente hinzufügt(von jemanden habe ich erfahren dass sowas nicht mehr in 2016 gibt deswegen die dumme Frage).

Momentan aber troubleshooting in dem Code. Mit sowas habe ich angefangen:
Code:
 BEGIN
 Zeile1 := 'Hallo Welt !!';
 Zeile2 := 'Zweite Zeile....';
 TmpPfad := 'C:\Windows\Temp\POSDispOut.dat';
 ComPort := 3
 END;
BEGIN
  Zeilenumbruch := '1B 44' // Umbruch f?r Display
  AllesLoeschen := '1B 40' // alles auf dem Display loeschen
 //  AllesLoeschen := ESC @; // alles auf dem Display loeschen
  Zeilenanfang := '0D'; // Cursor am Anfang der Zeile positionieren

  Datei.CREATE(TmpPfad);
  Datei.OPEN(TmpPfad);
  Datei.TEXTMODE(FALSE);

//  Datei.WRITE(AllesLoeschen);
  Datei.WRITE(FORMAT(Zeile1)); // erste Zeile ausgeben
//  Datei.WRITE(Zeilenumbruch);
//  Datei.WRITE(Zeilenanfang);
  Datei.WRITE(FORMAT(Zeile2)); // zweite Zeile ausgeben

  Datei.CLOSE;

  CREATE(WSH);
  WSH.Exec('cmd.exe /Q /C type ' + TmpPfad + ' > ' + FORMAT(ComPort));
  CLEAR(WSH);
PAGE.RUN(Number [, Record] [, Field])
END;


Wenn ich die Steuerzeichen definiere dann erhalte ich:
Control characters.png


Wenn ich die Steuerzeichen rauskommentiere und versuche zu speichern und kompilieren dann erhalte ich:
WSH-Automation.PNG


Bis jetzt danke für die Hilfe!
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: Kundendisplay Ansteuerung in NAV oder C# - import einer

9. August 2016 18:29

Hallo,

das ganze Beispiel funktioniert nur, wenn der Servicetier auch auf dem Rechner läuft, an dem das Kundendisplay angeschlossen ist. Ansonsten musst du da ein wenig mehr Gehirnschmalz rein stecken, weil die Datei auf dem Servicetier erzeugt wird, die Schnittstelle auf dem Client. :-?

Desweitern funktioniert das mit den ESC- Sequenzen so nicht. Der richtige Ansatz ist folgender:

1. Du definierst zunächst eine Textvariable in der Länge der ESC- Sequenz.
2. du definierst folgenden Code:
Code:
AllesLoeschen:= '  '; // Anzahl Leerzeichen in der Länge der ESC- Sequenz. (kann auf einigen NAV-Systemenweggelassen werden)
AllesLoeschen[1] := 27;  // 0x1B
AllesLoeschen[2] := 64;  // 0x40


dabei muss du aufpassen, das du die Zeichen in der Codierung ausgibst, die das Kundendisplay versteht (Umlaute, CP437,CP850,....?)

Bei allem Respekt, die Lösung ist für NAV2016 ziemlich krank. :shock:

Du solltest hier mit Dotnet direkt auf die COM- oder OPOS- Schnittstelle zugreifen, das funktioniert besser, und schneller.

Gruß Fiddi