1

Тема: VBS: Как к переменной rs(6) объекта recordset прибавить число

Подскажите пожалуйста как прибавить к переменной rs(6) объекта recordset число - 1778296458317019339, что я не делаю у меня при разных значениях rs(6) в сумме получается одно и то же число?

Кто рано встает того и тапки

2

Re: VBS: Как к переменной rs(6) объекта recordset прибавить число

Давайте код в студию, на костях не гадаем...

Времени не хватает... :-(

3 (изменено: pavlikspb, 2010-11-24 19:14:02)

Re: VBS: Как к переменной rs(6) объекта recordset прибавить число

Смысл такой - берем данные из одной базы и кидает в другую в разные таблицы. Из поля TCARDISSUE.FCARDNUM мы получаем значение которое должно быть десятичным числом, добавляем к нему смещение 1778296458317019339 и преобразуем в двоичные данные, которые запихиваем в поле CODEKEY другой базы

Dim conn1, conn2
Dim rs1, rs2, field_data, i
Dim ncdk

Set conn1 = CreateObject("ADODB.Connection")
Set conn2 = CreateObject("ADODB.Connection")

conn1.Open ("Provider=MSDASQL.1;Data Source=Апакс25;" & "Trusted_Connection=no;Initial Catalog=Apacs;" & "User ID=1; password=1")
conn2.Open ("Data Source = sphinx; Initial Catalog = tc-db-main; User ID=root")
set rs1 = conn1.Execute("SELECT TCARDISSUE.FID, TCARDHOLDERS.FLAST, TCARDHOLDERS.FFIRST, TCARDHOLDERS.FMIDDLE, TCARDISSUE.FACTIVE, TCARDISSUE.FDATETO, TCARDISSUE.FCARDNUM, TCARDISSUE.FCREATEDATE, TCARDHOLDERS.FTITLE, TCARDHOLDERS.FDEPT, TCARDIMAGES.FIMG, TOTHERVALUE.FOTHER11, TOTHERVALUE.FOTHER12, TOTHERVALUE.FOTHER13 FROM (TCARDIMAGES INNER JOIN (TCARDHOLDERS INNER JOIN TCARDISSUE ON TCARDHOLDERS.FID = TCARDISSUE.FCHID) ON TCARDIMAGES.FID = TCARDHOLDERS.FPHOTO) INNER JOIN TOTHERVALUE ON TCARDISSUE.FCHID = TOTHERVALUE.FCHID ORDER BY TCARDISSUE.FID")
set rs2 = CreateObject("ADODB.Recordset")
set rs3 = CreateObject("ADODB.Recordset")

' === Тело скрипта ===
                            
rs2.CursorType = 3
rs2.LockType = 3
rs2.Open "PERSONAL", conn2
rs3.CursorType = 3
rs3.LockType = 3
rs3.Open "PHOTO", conn2

rs1.MoveFirst
do while not rs1.eof
        rs2.AddNew
        rs3.AddNew
        rs2.Fields("ID").Value = rs1(0)
        rs3.Fields("ID").Value = rs1(0)
        rs3.Fields("PREVIEW_WIDTH").Value = "110"
        rs3.Fields("PREVIEW_HEIGHT").Value = "146"
        'rs3.Fields("PREVIEW_RASTER").Value = rs1(10)
        rs3.Fields("HIRES_WIDTH").Value = "225"
        rs3.Fields("HIRES_HEIGHT").Value = "339"
        'rs3.Fields("HIRES_RASTER").Value = rs1(10)
        rs2.Fields("NAME").Value = trim(""&rs1(1)&" "&rs1(2)&" "&rs1(3))
        rs2.Fields("POS").Value = trim(""&rs1(8))
        rs2.Fields("TABID").Value = trim(""&rs1(11))
        rs2.Fields("TYPE") = "EMP"
        rs2.Fields("EXPTIME").Value = rs1(5)
        rs2.Fields("CREATEDTIME").Value = rs1(7)
        rs2.Fields("DESCRIPTION").Value = trim(""&rs1(9)&vbCrLf&"Номер приказа:"&rs1(12)&vbCrLf&"Примечание:"&rs1(13))
        ncdk=(rs1(6)+1778296458317019339)                                                          'проблема с этими
        rs2.Fields("CODEKEY").Value = String2ByteArray(ncdk)                                  'строками
        Select Case rs1(4)
            Case 1
            rs2.Fields("STATUS").Value = "AVAILABLE"
            Case Else
            rs2.Fields("STATUS").Value = "FIRED"
            rs2.Fields("FIREDTIME").Value = rs1(5)
        End Select
        'A = rs1(0)
        'E = "D:\FOTO\"&A&".BMP"
        'C = SaveBinaryData(E, rs1(10))
        rs2.Fields("CODEKEYTIME").Value = Now()
        rs2.Update
        rs3.Update
rs1.MoveNext

loop
WScript.Echo "ГОТОВО"
conn1.Close
conn2.Close

' === Функции и процедуры ===

Function String2ByteArray(str)
    Dim OriginalLocale
    OriginalLocale = SetLocale("en-us")
    With CreateObject("ADODB.Stream")
        .Type = 2 'adTypeText
        .Charset = "windows-1251"
        .Open
        .WriteText str, 0
        .Position = 0
        .Type = 1 'adTypeBinary
        String2ByteArray = .Read
    End With
    SetLocale OriginalLocale
End Function

Function SaveBinaryData(filename, byteArray)
    Const adSaveCreateOverWrite = 2
    With CreateObject("ADODB.Stream")
        .Type = 1 'adTypeBinary
        .Open
        .Write byteArray
        .SaveToFile filename, adSaveCreateOverWrite
        .Close
    End With
End Function
Кто рано встает того и тапки

4

Re: VBS: Как к переменной rs(6) объекта recordset прибавить число

Попробуйте так, и оно должно быть правильней...

ncdk=rs1.Fields("FCARDNUM")+1778296458317019339              ' Если оно числовое
ncdk=CDbl(rs1.Fields("FCARDNUM"))+1778296458317019339     ' Если оно текстовое
Времени не хватает... :-(

5

Re: VBS: Как к переменной rs(6) объекта recordset прибавить число

Все равно не работает на выходе по всем записям одно и то же число

Кто рано встает того и тапки

6

Re: VBS: Как к переменной rs(6) объекта recordset прибавить число

Поле FCARDNUM какого типа ?

Времени не хватает... :-(

7

Re: VBS: Как к переменной rs(6) объекта recordset прибавить число

INTEGER

Кто рано встает того и тапки

8 (изменено: Евген, 2010-11-24 19:44:38)

Re: VBS: Как к переменной rs(6) объекта recordset прибавить число

а так

ncdk=CInt(rs1.Fields("FCARDNUM").Value)+1778296458317019339

а ещё мосле этой строчки сделайте так

Msgbox ncdk

и что она выдаст ?
надо дебагить код...

Времени не хватает... :-(

9

Re: VBS: Как к переменной rs(6) объекта recordset прибавить число

Строка: 50
Символ: 3
Ошибка: Переполнение: 'CInt'

Кто рано встает того и тапки

10 (изменено: Евген, 2010-11-24 19:54:20)

Re: VBS: Как к переменной rs(6) объекта recordset прибавить число

Приведите плиз одно-два значения поля FCARDNUM, чтобы визуально увидеть его содержимое...
ну или если нельзя - то опишите...   (например: 20-ти значное число...)

Времени не хватает... :-(

11 (изменено: pavlikspb, 2010-11-24 19:58:19)

Re: VBS: Как к переменной rs(6) объекта recordset прибавить число

Самое маленькое значение 1, а самое большое на данный момент 16777174, еще существует порядка 10 000 значений этого поля

Кто рано встает того и тапки

12 (изменено: pavlikspb, 2010-11-24 20:02:58)

Re: VBS: Как к переменной rs(6) объекта recordset прибавить число

Может можно упростить? Мне надо числовое значение сдвинуть и перевести в двоичное, что бы загрузить его в другую базу. Может поменять слагаемые местами - т.е. сначала преобразовать в двоичное число, а потом добавить двоичное смещение?

Кто рано встает того и тапки

13

Re: VBS: Как к переменной rs(6) объекта recordset прибавить число

pavlikspb пишет:

Самое маленькое значение 1, а самое большое на данный момент 16777174, еще существует порядка 10 000 значений этого поля

ну тогда

ncdk=CLng(rs1.Fields("FCARDNUM").Value)+1778296458317019339

пробуйте...

Времени не хватает... :-(

14 (изменено: pavlikspb, 2010-11-24 20:08:03)

Re: VBS: Как к переменной rs(6) объекта recordset прибавить число

без изменений...ответ опять одинаковый.
Если в поле подставлять не переменные, а целые числа, то результат выдает разный

Кто рано встает того и тапки

15 (изменено: Евген, 2010-11-24 20:10:27)

Re: VBS: Как к переменной rs(6) объекта recordset прибавить число

а что выдало

Msgbox ncdk

и какое было значение поля FCARDNUM

Времени не хватает... :-(

16

Re: VBS: Как к переменной rs(6) объекта recordset прибавить число

Когда ответ одинаковый, то результат всегда получается 3543267717139282230

Кто рано встает того и тапки

17

Re: VBS: Как к переменной rs(6) объекта recordset прибавить число

pavlikspb пишет:

Может поменять слагаемые местами - т.е. сначала преобразовать в двоичное число, а потом добавить двоичное смещение?

Наверное этот путь будет правильным...

У меня сейчас напрашивается вопрос - с насколько большими числами может работать VBScript ?

Времени не хватает... :-(

18

Re: VBS: Как к переменной rs(6) объекта recordset прибавить число

входное число     выходно число(ncdk)
5415622               1,77829645832244E+18
5426246               1,77829645832245E+18
5600614               1,77829645832262E+18

Кто рано встает того и тапки

19

Re: VBS: Как к переменной rs(6) объекта recordset прибавить число

только как это реализовать?

Кто рано встает того и тапки

20 (изменено: Евген, 2010-11-24 21:01:05)

Re: VBS: Как к переменной rs(6) объекта recordset прибавить число

Преобразование в двоичное... (оба решения не мои !!!)
проверка выявила взаимную работоспособность !!!

msgbox bin2dec(dec2bin(135))

но с такими числами 1778296458317019339 не работает

Function Dec2Bin(n)
Do Until n = 0
    If (n Mod 2) Then Dec2Bin = "1" & Dec2Bin Else Dec2Bin = "0" & Dec2Bin
    n = n \ 2
Loop
End Function

и обратно, после смещения...

Function Bin2Dec(strBin)
  Dim intLen, intPos, intValue, strTemp, strValue
  intLen = Len(strBin)
  intPos = 1
  intValue = 0
  strTemp = strReverse(strBin)

  Do While intPos <= intLen
    strValue = Mid(strTemp, intPos, 1)
    Select Case strValue
      Case "0"
      Case "1"
        If intPos = 1 Then
          intValue = intValue + 1
        Else
          intValue = intValue + (2 ^ (intPos - 1))
        End If 
      Case Else
        intValue = Empty
        Exit Do
    End Select 
    intPos = intPos + 1
  Loop

  Bin2Dec = intValue
End Function
Времени не хватает... :-(

21 (изменено: pavlikspb, 2010-11-24 21:17:44)

Re: VBS: Как к переменной rs(6) объекта recordset прибавить число

может это может как-то решить проблему:
если переводить выходное поле, то в двоичном виде мы получаем 101011011100011100110101,
а при добавлении смещения получаем                                   1100010101101110001110011010100000000000000000000000000000000,
выходит, что мы можем добавлять смещение относительно  первых 5 знаков, а нули просто дописывать, что-то я совсем запутался...

Кто рано встает того и тапки

22

Re: VBS: Как к переменной rs(6) объекта recordset прибавить число

Я просто не догоняю, что за смещение нужно сделать, а самое главное - зачем ?
Смещение делается, как Вы уже догадались, в текстовом режиме. Это проще всего, сейчас надо определиться куда нужно сделать смещение, и какое.
Т.е. слева или с права будем добавлять, что добавлять, и в каком количестве...

Времени не хватает... :-(

23

Re: VBS: Как к переменной rs(6) объекта recordset прибавить число

Есть старая система контроля доступа - поддерживает номер карты одним размером, ее решили обновить на новую, которая поддерживает номер карты большим размером. Вводить 10000 карточек вручную, еще учитывая все дополнительные поля да фотографии - убийство. Вот и возникла необходимость в этом скрипте. В принципе он все поля, кроме фотографий и номеров перебрасывает, а это уже не мало...

Кто рано встает того и тапки

24

Re: VBS: Как к переменной rs(6) объекта recordset прибавить число

сравнивая результаты одних и тех же карточек, но в разных системах получаем изменение, только в первых - 41 бите, а в остальны 40 нули так и остаются...

Кто рано встает того и тапки

25 (изменено: pavlikspb, 2010-11-24 23:59:38)

Re: VBS: Как к переменной rs(6) объекта recordset прибавить число

уточнение, результат должен быть наверное такой:
"11000 & Dec2Bin(rs1.Fields("FCARDNUM").Value) & 0000 0000 0000 0000 0000 0000 0000 0000"
?

Кто рано встает того и тапки

26

Re: VBS: Как к переменной rs(6) объекта recordset прибавить число

Все, разобрался, в базе куда их необходимо выгружать поле CODEKEY типа TINYBLOB, а само смещение уже превышало размер поля, поэтому и получалась ерунда, когда размер мещения убавил все заработало. А почему я изначательно пытался загрузить такое большое число - потому что ввел в заблуждение сам программный продукт, у него в окне информации выводится содержимое этого поля, но 32 бита он дописывает сам (видно заложено на будущее). В любом случае большое спасибо.

Кто рано встает того и тапки

27 (изменено: pavlikspb, 2010-11-25 15:08:59)

Re: VBS: Как к переменной rs(6) объекта recordset прибавить число

Еще раз большое спасибо!!!

Кто рано встает того и тапки

28

Re: VBS: Как к переменной rs(6) объекта recordset прибавить число

Решил таким способом

ANUMB=hex(rs1(6))
         SNUMB=6-Len(ANUMB)
         HNUMB=String(SNUMB, "0")&ANUMB
         rs2.Fields("CODEKEY").Value = trim("18" & HNUMB & "00000000")

где 18 - это флаг, который ставится при наличии номера карты, HNUMB - сам номер карты в шестнадцатиричном формате, а 00000000 - зарезервированно на будущее.

Кто рано встает того и тапки