schreddermaus
12th July 2010, 09:40
Hi,
kann mir jemand weiterhelfen? Ich möchte in einer Multi-Language-Umgebung ein Beschreibungsfeld einem anderen Beschreibungsfeld zuordnen, genauer gesagt möchte ich den Ortsnamen als Clusterbezeichnung festlegen. Dabei hat das Feld des Ortsnamen 30 Zeichen Länge und die Clusterbezeichnung 50 Zeichen. Sollte ja rein logisch gesehen funktionieren, da 30 kleiner ist als 50. Pustekuchen... wenn ich nach der Zuweisung nun die Clusterbezeichnung speichern will bekomme ich eine out of range Fehlermeldung.
Gibt es da einen Trick, wie man Bezeichnungsfelder in einer Multi Language Umebung zuweist?
wiggum
16th July 2010, 16:50
Falls das Feld mit dem Ortsnamen nicht als Multibytestring definiert ist, solltest du die Zuweisung mittels der Funktion mb.cast$() durchführen:
tcemm135.desc = mb.cast$(<Orstname>)
schreddermaus
20th July 2010, 10:28
Funktioniert leider auch nicht. Das ist mein bisheriger Code:
string tmp.ort(30)
db.retry.point()
select ml_one_lang(tccom139.dsca):tmp.ort
from tccom139
where tccom139._index1 = {:tccom130.ccty, :tccom130.cste, :tccom130.ccit}
as set with 1 rows
selectdo
tsbsc100.desc = mb.cast$(tmp.ort)
endselect
db.insert(ttsbsc100, db.retry)
commit.transaction()
Aber er bricht mir immer noch beim Insert ab, da tsbsc100.desc nicht "richtig" gefüllt ist.
Ich habe schon fast alle Möglichkeiten der Zuordnung probiert. Komischerweise kann ich ccit (ein normaler String) zuweisen, aber keinen normalen String, dem ich vorher den Ortsnamen zugewiesen habe. Ich habe auch schon probiert, mit mb.cast.to.str$() den Ortsnamen erst einmal als normalen String zu konvertieren und dann direkt der Beschreibung zuzuweisen. Hat auch nichts gebracht. :(
bdittmar
20th July 2010, 14:25
Funktioniert leider auch nicht. Das ist mein bisheriger Code:
Aber er bricht mir immer noch beim Insert ab, da tsbsc100.desc nicht "richtig" gefüllt ist.
Ich habe schon fast alle Möglichkeiten der Zuordnung probiert. Komischerweise kann ich ccit (ein normaler String) zuweisen, aber keinen normalen String, dem ich vorher den Ortsnamen zugewiesen habe. Ich habe auch schon probiert, mit mb.cast.to.str$() den Ortsnamen erst einmal als normalen String zu konvertieren und dann direkt der Beschreibung zuzuweisen. Hat auch nichts gebracht. :(
Hallo,
mir stellen sich hier ein paar grundsaetzliche Fragen.
Feld tccom139.dsca ist Typ MBS Laenge 30, phys. Laenge 200 (domain tcdsca)
Feld tsbsc100.desc ist Typ MBS Laenge 50. phys. Laenge 200 (domain tsmdm.dscb)
Notes
In program scripts, it is not possible to assign a multibyte character (for example, Chinese) to a multibyte string.
When the string str is declared as: STRING str(x) MB | x is the number of display positions then enough memory is reserved for it to contain any reasonable TSS string which needs at most x positions to be displayed. One TSS character occupies 1 or 4 bytes of memory and needs 0, 1, or 2 positions to be displayed. The interpretation of when a TSS string is 'reasonable' differs, dependent on the system configuration.
The string str(x;1) contains one character, and a size of one or four bytes. If the character has a size of 4 bytes, it is a TSS character.
It is not advisable to assign a multibyte string to a normal string, as this can cause problems regarding storage space and special manipulations like indexing.
You cannot use multibyte strings in combination with the BASED mechanism.
Multibyte strings are not only meant for the support of typical multibyte scripts like Japanese, Chinese, and Korean, but also for the support of 'foreign' single byte scripts, like Greek, Cyrillic, Hebrew, Arabic, and Thai.
All supported scripts contain the ASCII table (C0 Controls and Basic Latin) character set as a subset. Notice that ASCII is a 7-bit character set (ranging from 0 to 127). The remaining single byte characters (ranging from 128 to 255, i.e. above the ASCII range) are ambiguous: their meaning differs in each script.
Strings not declared as multibyte should only be used for characters which are available in all scripts. This means that only ASCII characters should be used.
MFG
wiggum
22nd July 2010, 08:19
Die einfachste Lösung dürfte sein, den selektierten Dateninhalt ohne das Zwischenfeld direkt in das Zielfeld zu schreiben, dann sollten deine Probleme gelöst sein.
Alternativ definiere dein Zwischenfeld als Multibyte-Feld, dann kannst du auch die Funktion mb.cast$() entfernen.
schreddermaus
23rd July 2010, 11:11
Das hab ich ja schon ganz am Anfang gemacht und hat nicht funktioniert ... :(
So langsam glaube ich in dem Script ist eine versteckte Kamera ... alles was funktionieren müsste funktioniert nicht ... *grml*
bdittmar
23rd July 2010, 13:23
Das hab ich ja schon ganz am Anfang gemacht und hat nicht funktioniert ... :(
So langsam glaube ich in dem Script ist eine versteckte Kamera ... alles was funktionieren müsste funktioniert nicht ... *grml*
Hallo,
leider habe ich im Moment kein LN Testsystem zur Verfuegung (Vacation) um es zu testen.
Aber ich wuerde mal folgenden Ansatz verfolgen:
string tmp.ort(200) | Pysikalischer MB ist 200
function read.description.tccom139()
{
select ml_one_lang(tccom139.dsca)
from tccom139
where tccom139._index1 = {:tccom130.ccty, :tccom130.cste, :tccom130.ccit}
as set with 1 rows
selectdo
tmp.ort = mb.cast.to.str$(tccom139.dsca)
write.to.tsbsc100()
endselect
}
function write.to.tsbsc100()
{
db.retry.point()
select tsbsc100.*
from tsbsc100 for update
where .....................
selectdo
tsbsc100.desc = mb.cast$(tmp.ort)
db.update(.....)
selectempty
tsbsc100.desc = mb.cast$(tmp.ort)
db.insert(......)
endselect
}
Also:
Sprachabhaengigen MB in Quelltabelle lesen
Gefundenen MB nach String(200) = tmp.ort casten, pys. Laenge = 200
Satz in Zieltabelle lesen.
String in der Variablen zurueck nach MB casten
Je nach Treffer, Update oder Insert
-----------------------------------------------------
mb.cast.to.str$()
Syntax:
function string mb.cast.to.str$ (string string_express)
Description
This function converts a specified string to a single-byte string. The content of the string remains the same.
Arguments
string string_express
Return values
The single-byte string.
Context
This function can be used in all script types.
Related topics
Inverse operation: mb.cast$()
----------------------------------------------
mb.cast$()
Syntax:
function string mb.cast$ (string string_expres)
Description
This function converts a specified string to a multibyte string. The content of the string remains the same.
Arguments
string string_expres
Return values
The multibyte string.
Context
This function can be used in all script types.
Related topics
Inverse operation: mb.cast.to.str$()
--------------------------------------------------------------
Evtl. ueber mb.export$ und mb.import$ !
MFG
schreddermaus
27th July 2010, 09:36
Ich glaube das größte Problem ist, dass es sich im eine Oracle Datenbank handelt. Habe gehört, da gibt es öfter Probleme
vahdani
27th July 2010, 13:28
hallo schreddermaus,
multibyte-Felder und Variablen werden in einer Multi-Language-Umgebung immer mit allen Datensprachenvarianten befüllt, wie das teschnich gelöst ist, kann ich nicht sagen, aber es sieht verdammt nach Zauberei aus. Das sieht man sehr gut in Debuger (Moral weiter unten!):
domain tcdsca l.dsca, l.dscb
string l.desc(30)
string l.data.lang(10)
long l.ret
l.data.lang = ml_get_datalang_of_softlang ("3")
|main.l.data.lang = "de_DE"
l.ret = ml_set_datalang(l.data.lang)
select *
from tcmcs001
where cuni = "box"
selectdo
|tcmcs001.dsca de_DE C[de_DE][0] = "Schachtel "
| en_GB [en_GB][0] = "Box "
| nl_NL [de_DE][0] = "Schachtel "
l.dsca = tcmcs001.dsca
|main.l.dsca de_DE C[de_DE][0] = "Schachtel "
| en_GB [en_GB][0] = "Box "
| nl_NL [de_DE][0] = "Schachtel "
l.dsca = ml_one_lang(tcmcs001.dsca, l.data.lang)
|l.dsca is now an array with:
|main.l.dsca de_DE C[de_DE][0] = "Schachtel "
| en_GB [en_GB][0] = "Schachtel "
| nl_NL [de_DE][0] = "Schachtel "
l.dscb = l.dsca
|l.dscb is now an array with:
|main.l.dscb de_DE C[de_DE][0] = "Schachtel "
| en_GB [en_GB][0] = "Schachtel "
| nl_NL [de_DE][0] = "Schachtel "
l.desc = ml_one_lang(tcmcs001.dsca, l.data.lang)
|l.desc is a String variable and is never a ML array:
|l.desc = "Schachtel "
endselect
Moral der Geschichte: Verwende eine einfache String-Variable als zwischenstop und befülle das Tabellenfeld dann mit dieser String-Variable.
schreddermaus
28th July 2010, 12:14
was muss ich denn includen, damit ich ml_one_lang auch nutzen kann?
vahdani
28th July 2010, 12:31
Es gibt kein Include. Dies ist eine Standardfunktion. Deine LN-Umgebung muss natürlich Multi-Language enabled sein. Ich habe dies an Porting Set 8.6a.01 getestet
ml_one_lang()
Syntax:
function string ml_one_lang() (const string mlv [, const string language])
Description
This function retrieves the value in a specific data language from a string variable.
Arguments
const string mlv a multi language value (string)
[const string language ] a valid Data Language code
Return values
The value in the specified data language'. If the optional argument 'language' is not specified: the value in the 'current data language'
This function can be used in SQL as well, to select values in just one language from the database.
Context
This function can be used in all script types.
schreddermaus
9th August 2010, 16:03
Hab's endlich hinbekommen. Musste noch Tools Interface Version auf 1501 setzen, damit ml_one_lang funktioniert. Damit und in Kombination mit mb.cast.to.str$() hat's dann letzen Endes hingehauen.
Vielen Dank für eure Hilfe! :)