Перевод базы Caché из 8 бит в Unicode

Preview:

Citation preview

Перевод базы из 8-бит в Unicode Александр Коблов

В чём разница

Нужно перенести данные и код

•  Код: –  $system.OBJ.Export()

•  Данные –  Нужно переконвертировать:

•  Строки –  Не нужно переконвертировать (всё остальное):

•  Числа •  $bitstring

–  Проблема: строки внутри списков

Те данные, что заведомо не нужно конвертировать

;8 bit USER>write ##class(%Collate).DisplayToLogical("Cache Standard") 5 USER>write ##class(%GlobalEdit).Create(,"Demo",5) 1 USER>merge ^Demo=^a USER>write ##class(%Global).Export(,"Demo","c:\temp\export.gof") ;Unicode USER>do $system.OBJ.Load("c:\temp\export.gof") USER>merge ^GlobalInCorrectColaltion = ^Demo

Что такое collation?

Cache standard ^c("W")=87 ^c("Y")=89 ^c("w")=119 ^c("y")=121 ^c("Ё")=1025 ^c("Б")=1041 ^c("Ж")=1046 ^c("б")=1073 ^c("ж")=1078 ^c("ё")=1105

Cyrillic1 ^c("w")=119 ^c("W")=87 ^c("y")=121 ^c("Y")=89 ^c("б")=1073 ^c("Б")=1041 ^c("ё")=1105 ^c("Ё")=1025 ^c("ж")=1078 ^c("Ж")=1046

Cyrillic3 ^c("W")=87 ^c("Y")=89 ^c("w")=119 ^c("y")=121 ^c("Б")=1041 ^c("Ё")=1025 ^c("Ж")=1046 ^c("б")=1073 ^c("ё")=1105 ^c("ж")=1078

Cyrillic4 ^c("W")=87 ^c("Y")=89 ^c("w")=119 ^c("y")=121 ^c("Б")=1041 ^c("Ё")=1025 ^c("Ж")=1046 ^c("б")=1073 ^c("ё")=1105 ^c("ж")=1078

Collation по умолчанию:

Администрирование > Конфигурация > Настройки поддержки нац. языков > Определение локали

Пример

USER>zwrite ^c // collation – Caché Standard ^c("Ё")=100 ^c("Г")=100 ^c("Ф")=100 USER>merge c=^c USER>zwrite c c("Г")=100 c("Ё")=100 c("Ф")=100

Те данные, что нужно конвертировать

USER>zwrite ^a ^a(1)="русская строка" ^a(2)="english string" ^a(3)=$lb("русская строка",1,1.3,$lb("другая строка"),$double(10))

Нужно как-то сериализовать. Например zwrite

Выгрузка с zwrite

set filename = “c:\temp\export.gbl” set globname = “^SomeGlobal” open filename:("NW":/GZIP=10)

use filename zwrite @globname close filename

Загрузка с zwrite

do DISABLE^%SYS.NOJRN do $system.Process.SetZEOF(1) set filename = “c:\temp\export.gbl”

open filename:(:/GZIP=10) for { use filename read x quit:$ZEOF=-1 xecute "s "_x } close filename

do ENABLE^%SYS.NOJRN

Другие варианты

•  Если данные в таблицах – SQL Gateway

And now For something completely different

* — третий аргумент в $Piece, $Extract, $List

;вместо $Piece("a,b,c,d",",",$Length("a,b,c,d",",")) USER>write $Piece("a,b,c,d", ",", *) d USER>write $Piece("a,b,c,d", ",", *-2) b USER>write $Piece("a,b,c,d", "," ,*-2,*) b,c,d USER>set list = $LB("a", "b" ,"c") USER>set $LI(list,*+1) = "d" USER>zwrite list list=$lb("a","b","c","d")

$Data(var, target)

●  Вместо: o  if $Data(^someval)#10=1 {

set val = ^someval // do some work with val

} o  if $Data(^someval,val)#10=1 {

// do some work with val }

$Order(var, dir, target)

●  Вместо: o  set id = “”

for { set id = $Order(^VendorData(id),1) quit:id=”” set val = ^VendorData(id)

} o  set id = “”

for { set id = $Order(^VendorData(id),1, val) quit:id=””

}

Xecute с параметрами

USER>set cmd = "(in,out) set a = in * in, out = a + a“, a = 3 USER>xecute (cmd, a, .b) USER>write a=9 b=18 USER>set cmd = "(in,out) {set a = in * in, out = a + a}“, a = 3 USER>xecute (cmd, a, .b) USER>write a=3 b=18

$ListBuild как l-value

USER>set list = $ListBuild("a","b","c","d","e") USER>set $LB(c1,,c3) = list USER>write c1="a" c3="c" USER>set a=2,b=3 USER>set $LB(a,b) = $LB(b,a) USER>write a," ",b 3 2

insert or update

create table testsql(c1 int primary key, c2 varchar(10)) insert or update into testsql values(10,'ten') insert or update into testsql values(10,'ten') insert or update into testsql values(20,'twenty')

c1 c2 10 ten 20 twenty

%vid как аналог limit

select *,%VID AS SubQueryID from (select top 10 Name,Age from Sample.Person where Age > 75 order by Name) where %VID > 4

Name Age SubQueryID Cooke,Charlotte B. 82 5 Donaldson,Patricia A. 89 6

Gibbs,Brenda R. 83 7 Gore,Violet V. 87 8 Iacobelli,Emma U. 90 9 Isaksen,Marvin B. 76 10

args(1/3)

USER>do ##class(testargs).m1("a","b","c","d") method m1 args=4 args(1)="a" args(2)="b" args(3)="c" args(4)="d"

args(2/3)

>do ##class(testargs).m2("a","b") method m2 args=2 args(1)="a" args(2)="b" method m1 args=4 args(1)="x" args(2)="z" args(3)="a" args(4)="b"

args(3/3)

USER>set args=4, args(1)=100, args(2)=200, args(4)=400 USER>do ##class(testargs).m3(args...) a = 100 b = 200 c = no val d = 400

Спасибо!

Color Palette

This is the standard palette for the template which is used as the default for charts and graphics.

Recommended