Kundendisplay Ansteuerung in NAV oder C# - import einer Form

Bild Microsoft Dynamics NAV 2016

Kundendisplay Ansteuerung in NAV oder C# - import einer Form

Beitragvon marcussulic » 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: Alles auswÀhlen
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: Alles auswÀhlen
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.
marcussulic
 
BeitrÀge: 16
Registriert: 25. Juli 2016 16:27

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

Beitragvon sweikelt » 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: Alles auswÀhlen
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: Alles auswÀhlen
                                                          Zeilenumbruch := 10; // Umbruch fr Display
                                                          AllesL”schen := 26; // alles auf dem Display l”schen
                                                          Zeilenanfang := 13; // Cursor am Anfang der Zeile positionieren
Benutzeravatar
sweikelt
Microsoft Partner
Microsoft Partner
 
BeitrÀge: 1776
Registriert: 18. November 2010 10:15
Wohnort: Oschatz
Realer Name: Stephan Weikelt
Arbeitsort: Berlin
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 3-2018 | D365BC

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

Beitragvon marcussulic » 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 auswÀhlen
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: Alles auswÀhlen
{ 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
Controller Indent.PNG (3.79 KiB) 495-mal betrachtet
marcussulic
 
BeitrÀge: 16
Registriert: 25. Juli 2016 16:27

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

Beitragvon sweikelt » 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 auswÀhlen
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.
Benutzeravatar
sweikelt
Microsoft Partner
Microsoft Partner
 
BeitrÀge: 1776
Registriert: 18. November 2010 10:15
Wohnort: Oschatz
Realer Name: Stephan Weikelt
Arbeitsort: Berlin
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: 3-2018 | D365BC

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

Beitragvon Kowa » 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: Alles auswÀhlen
<?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>
DateianhÀnge
F50000 Display Test.zip
(1.27 KiB) 13-mal heruntergeladen
Gruß, Kai

Frage beantwortet? Schreibe bitte [Gelöst] vor den Titel des ersten Beitrags.
Bitte erst suchen, dann fragen. Bitte beachte den kleinen Community-Knigge.
Kein Support per PN, Mail, Messenger oder Telefon! DafĂŒr ist dieses Forum da.

Download: Dynamics NAV Object Text Explorer (Alternativlink). MVP Alumni
Benutzeravatar
Kowa
Moderator
Moderator
 
BeitrÀge: 7835
Registriert: 17. Juni 2005 17:32
Wohnort: Bremen
Realer Name: Kai Kowalewski
Arbeitsort: Osterholz-Scharmbeck
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics 365
Microsoft Dynamics Version: BC, NAV 2018 bis Navision 2.01

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

Beitragvon marcussulic » 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 auswÀhlen
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: Alles auswÀhlen
 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
Control characters.png (4.05 KiB) 442-mal betrachtet


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


Bis jetzt danke fĂŒr die Hilfe!
marcussulic
 
BeitrÀge: 16
Registriert: 25. Juli 2016 16:27

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

Beitragvon fiddi » 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: Alles auswÀhlen
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
Wer aufhört besser zu werden, hat aufgehört gut zu sein. (frei nach Philip Rosenthal)
Frage beantwortet? Schreibe bitte [Gelöst] vor den Titel des ersten Beitrags.
Bitte erst suchen, dann fragen. Bitte beachte den kleinen Community-Knigge.
Kein Support per PN, Mail, IM oder Telefon! DafĂŒr ist dieses Forum da.
fiddi
Moderator
Moderator
 
BeitrÀge: 7091
Registriert: 9. Juni 2008 10:13
Realer Name: Hans Heinrich Fiddelke
Arbeitsort: Bremen
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV
Microsoft Dynamics Version: NAV2.6-aktuell


ZurĂŒck zu NAV 2016

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast