Programmierung C/FRONT unter .NET C#

20. Oktober 2006 16:01

Bei einem AssignField stibt mein Programm in C#
Kann mir jemand ein Code-Beispiel zuspielen. Mein Programm stirbt dabei mit einem TYPE-MISMATCH
Zuletzt geändert von Guido am 21. Oktober 2006 11:34, insgesamt 1-mal geändert.

20. Oktober 2006 19:00

Du musst schon etwas mehr erzählen, was willst du tun, wie lautet der fragliche Code, wie heißt die Fehlermeldung genau usw.

20. Oktober 2006 19:50

Am besten postest du mal ein komplettes codestück mit dem man den Fehler provozieren kann.

Ich hatte damals, als ich C/FRONT gestestet habe was an der dll selbst geändert (4.0 ohne SP), da dort auch ein mir entfallener merkwürdiger Fehler aufgetreten war.

21. Oktober 2006 10:08

Mein Code sieht wie folgt aus:
Hier mein Programm-Code:
Code:
                    int TableRef = 0;
                    int Record = 0;
                    int Field_No = 0;
                    object PEBE_OBJ;
                    int TableNo = _cf.TableNo("PEBE Import Lines");
                    bool TabOpen = _cf.OpenTable(ref TableRef, TableNo);
                    _cf.AllowRecordNotFound();
 
                    _cf.BWT();//Beginn Transaktion
                    Record = _cf.AllocRec(TableRef);
                    _cf.InitRec(TableRef, Record);
                    // 1         Journal Template Name         Code    10    Fix "MUSTER"
                    Field_No = _cf.FieldNo(TableRef, "Journal Template Name");
                    string Line_No = "MUSTER";
                    PEBE_OBJ = Line_No.Trim();
                    _cf.AssignField(TableRef, Record, Field_No, ref PEBE_OBJ);

//                DIESER Befehl stürzt ab!!

//
                     bool insert = _cf.InsertRec(TableRef, Record);
                    if (!insert)
                    {
                        throw (new Exception("Fehler beim Einfügen " + _cf.LastError().ToString()));
                    }
                    // Finale
                    _cf.EWT();   // End of Transaktion
                    _cf.FreeRec(Record);
                    _cf.CloseTable(TableRef);




21.10.2006 - 18:02 Uhr: Programmcode für die bessere Lesbarkeit in [Code]-Tags gepackt.
Timo Lässer
MSDynamics.de-Team

22. Oktober 2006 12:01

Ok, dein Code sieht aus wie für eine C/FRONT 3.70 oder 4.0 (ohne SP) dll. Jetzt weiß ich auch wieder, warum sich mir dabei die Nackenhaare sträuben. Das Ding ist Buggy³.
Die dll hatte ich damals zum evaluieren resourced, angepasst und noch einen Wrapper geschrieben. Den kann ich aber irgendwie nicht mehr finden.

Es gibt in dem beiliegenden C/FRONT Assembly diverse Klassen wie NavisionCode, NavisionText, NavisionDecimal. Denen kann man bei der Instanzierung oder auch über z.B. NavisionCode.Parse("string") einen Wert zuweisen. Soweit ich mich erinnere erben diese Klassen von NavisionValue. Wegen der dadurch entstehenden aufwendingen Programmierung hatte ich den Wrapper damals gebaut.

In deinem Fall mit AssignField, solltest du versuchen, anstatt PEBE_OBJ entweder die NavisionXXX values direkt, oder navXXX.GetBytes() zu übergeben und schauen, ob es damit läuft.

Code:
NavisionCode navCode = NavisionCode.Parse("MUSTER");
_cf.AssignField(TableRef, Record, Field_No, ref navCode); // Variante 1
_cf.AssignField(TableRef, Record, Field_No, ref navCode.GetBytes()); // Variante 2



Solltet ihr auf C/FRONT zukünftig angewiesen sein, empfehle ich ein technisches Update auf 4.0 SP2 (bzw. SP3 in einigen Tagen). Dafür füge ich auch ein Beispiel bei.

Code:
using System;
using System.Collections.Generic;
using System.Text;

using Microsoft.Navision.CFront;

namespace NavCfrontTest
{
    class Program
    {
        static void Main(string[] args)
        {
          CFrontDotNet cfront;
          string serverName;
            string databaseName;
            string companyName;

            serverName = "Server";
            databaseName = "Database";
            companyName = "Company";

            cfront = new CFrontDotNet(NavisionDriverType.Sql);

         // Verbinden mit Standardeinstellungen: 32MB cache, NT auth
            cfront.ConnectServerAndOpenDatabase(
                serverName, NavisionNetType.SqlDefault, databaseName,
                32786, true, true, "", "");
         
         cfront.OpenCompany(companyName);

            // RecordNotFound sollte keine Exception werfen, tut er aber doch...
            cfront.Allow(NavisionAllowedError.RecordNotFound);

            int pictureTableNo = cfront.TableNo("Picture");
            int pictureTableRef = cfront.OpenTable(pictureTableNo);
            int pictureRecordRef = cfront.AllocRecord(pictureTableRef);
            int noFieldNo = cfront.FieldNo(pictureTableRef, "No.");

            bool recordFound = false;

            // Filtern und Datensatz suchen
            try
            {
                cfront.SetFilter(pictureTableRef, noFieldNo, "TESCHT");
                recordFound = cfront.FindFirstRecord(pictureTableRef, pictureRecordRef);
            }

            catch (CFrontException cfrontEx)
            {
                recordFound = false;               
            }


            bool transactionSuccessful = false;
            cfront.BeginWriteTransaction();

            // Loeschen wenn gefunden, Insert wenn nicht
            if (recordFound == true)
            {
                transactionSuccessful = cfront.DeleteRecord(pictureTableRef, pictureRecordRef);
            }
            else
            {
                int descriptionFieldNo = cfront.FieldNo(pictureTableRef, "Description");

                cfront.InitRecord(pictureTableRef, pictureRecordRef);

                cfront.StringToField(pictureTableRef, pictureRecordRef, noFieldNo, "TESCHT");
                cfront.StringToField(pictureTableRef, pictureRecordRef, descriptionFieldNo, "Tescht Beschreibung");

                transactionSuccessful = cfront.InsertRecord(pictureTableRef, pictureRecordRef);
            }

            // Je nachdem ob alles glatt lief oder nicht, die Transaktion beenden oder abbrechen
            if (transactionSuccessful == false)
            {
                cfront.AbortWriteTransaction();
            }
            else
            {
                cfront.EndWriteTransaction();
            }

           
            // Aufraeumen
            cfront.FreeRecord(pictureRecordRef);
            cfront.CloseTable(pictureTableRef);

            cfront.CloseCompany();
            cfront.CloseDatabase();
            cfront.DisconnectServer();
        }
    }
}