On-line: PSP, SergKis, гостей 0. Всего: 2 [подробнее..]
АвторСообщение
Администратор




Пост N: 599
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 18.10.07 16:24. Заголовок: Динамическая смена алиаса открытого файла


Вот возникла такая потребность

Есть некоторые алгоритмы (функции), которые делают выборку из определенных таблиц, обращаясь к ним по алиасу

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

Чтобы не закрывать/открывать файлы, хотелось бы иметь возможность изменить алиас уже открытого файла. Это ведь всего лишь строковая переменная

В харборе все открыто, и этот вопрос там решить несложно

А как в клиппере ? Есть ли функция изменения имени алиаса через api rdd ?
Может такое уже делали ?

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 11 [только новые]


Администратор




Пост N: 600
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 18.10.07 16:45. Заголовок: Re:


Наверное сделаю так
Память освобождать/выделять мне в лом, я просто обеспечу, чтобы длина алиаса была токой же самой

#include <extend.h>
#include <rdd.api>
#include <item.api>

#include <string.h>

CLIPPER NEWALIAS(void)
{
extern WORKAREAP* _workareas;
WORKAREAP AreaInfo = * _workareas;

strcpy(AreaInfo->alias, _parc(1));
_ret();

}


Спасибо: 0 
ПрофильЦитата Ответить



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 18.10.07 17:23. Заголовок: Re:


Я делаю проще: завожу переменную, скажем MALIAS и присваиваю ей разные значения, а в процедуре, которая занимается обработкой, все обращения к таблице выполняю через эту переменную, например:
(MALIAS)->FIELD
Такой метод используется уже давно. Работает нормально.

Спасибо: 0 
Цитата Ответить
постоянный участник


Пост N: 335
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 18.10.07 19:10. Заголовок: Re:


А если вызывать эти функции с указанием алиаса перед ними самими?

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 601
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 19.10.07 08:07. Заголовок: Re:


Эти функции используют несколько таблиц

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 603
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 19.10.07 09:29. Заголовок: Re:


Не работает моя функция. Неправильная значит

Ибо сказано в rdd.api:

FARP alias; // Pointer to the alias symbol for this workarea

Может быть это ссылка не на алиас, а на symbol, его содержащий ?

Вообще функция Alias() выглядит так:

ALIAS:
push bp
mov bp,sp
sub sp,26H
push si
mov byte ptr -20H[bp],0
mov ax,1
push ax
call far ptr __lparam
add sp,2
mov word ptr -22H[bp],ax
or ax,ax
jne L$76
mov ax,word ptr __selection
mov word ptr -22H[bp],ax
L$76:
cmp word ptr -22H[bp],100H
jae L$77
mov bx,word ptr -22H[bp]
shl bx,1
shl bx,1
les si,dword ptr __Workareas
mov ax,word ptr es:[bx+si]
mov dx,word ptr es:2[bx+si]
mov word ptr -26H[bp],ax
mov word ptr -24H[bp],dx
or ax,dx
je L$77
lea ax,-20H[bp]
push ss
push ax
push dx
push word ptr -26H[bp]
les bx,dword ptr -26H[bp]
les bx,dword ptr es:[bx]
call dword ptr es:70H[bx]
add sp,8
L$77:
lea ax,-20H[bp]
push ss
push ax
call far ptr __retc
add sp,4
pop si
mov sp,bp
pop bp
retf

Может быть это наведет на какую то мысль ?


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 107
Зарегистрирован: 28.06.05
ссылка на сообщение  Отправлено: 19.10.07 12:11. Заголовок: Re:



.286
SMART
JUMPS
LOCALS

public RnAlias

extrn __parc : far
extrn __chk_sym : far
extrn __get_sym : far


RNALIAS_TEXT SEGMENT BYTE PUBLIC 'CODE'
ASSUME CS: RNALIAS_TEXT

; Функция RnAlias переименовывает алиас открытой базы данных.
; Формат вызова: RnAlias( AliasName, NewName ), где AliasName - строка с
; именем алиаса, который будет переименован, NewName - строка нового имени
; для алиаса. Если алиас с именем NewName уже существует, то его старое
; содержимое ( т. е. старый номер рабочей области ) будет потеряно. Символ с
; именем AliasName после отрабатывания функции алиасом быть перестает, хотя
; остается определенным. Возвращаемое значение отсутствует.

RnAlias PROC pascal far
push SI BP
mov BP,SP

push 1
call __parc
push DX AX
call __chk_sym
or DX,DX
jz @@ret

mov ES,DX
mov BX,AX
xor SI,SI
xchg SI,word ptr ES:[BX][6]

push 2
call __parc
push DX AX
call __get_sym
mov ES,DX
mov BX,AX
mov word ptr ES:[BX][6],SI

@@ret: leave
pop SI
ret
RnAlias ENDP

RNALIAS_TEXT ENDS
END

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 604
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 19.10.07 12:46. Заголовок: Re:


Спасибо !

Мысль понятна. В глобальной таблице выполняется поиск нужного символа, и затем он подменяется

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 605
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 19.10.07 12:51. Заголовок: Re:


wad1 пишет:

 цитата:
Я делаю проще: завожу переменную, скажем MALIAS и присваиваю ей разные значения, а в процедуре, которая занимается обработкой, все обращения к таблице выполняю через эту переменную, например:
(MALIAS)->FIELD
Такой метод используется уже давно. Работает нормально.



Я тоже иногда использую такой прием, но тут возникла необходимость использовать разные файлы в одном большом модуле, и переделок слишком уж много
Собственно задача такая. Есть архивная БД и рабочая БД. При формировании отчета
определяется, рабочий это период или архивный, и соответсвенно используется нужная БД
Захотелось обойтись без постоянного открытия/закрытия файлов


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 337
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 19.10.07 16:12. Заголовок: Re:


SergeJa пишет:

 цитата:

call __chk_sym
or DX,DX
jz @@ret

mov ES,DX
mov BX,AX
...



В этом коде есть неточность после call __chk_sym. Вместо or Dx,dx точнее было бы проверить or AX,dx, то есть адрес передается в регистрах DX:AX. Если функция не нашла, что хотела, то она в DX и AX заносит нули.

И вообще функция написана криво! Особенно мне не нравится предложения

push SI BP
mov BP,SP

Правильнее было бы написать

push bp
mov bp,sp
push si

А еще лучше воспользоваться упрощающими директивами типа USES, если код пишется на Borland Tasm.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 606
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 20.10.07 12:55. Заголовок: Re:


Старый добрый ассемблер :)
Эх, давненько я не брал в руки шашек

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 108
Зарегистрирован: 28.06.05
ссылка на сообщение  Отправлено: 20.10.07 14:19. Заголовок: Re:


Pasha пишет:

 цитата:
Эх



rnalias.obj

0000000000: 80 0D 00 0B 72 6E 61 6C │ 69 61 73 2E 61 73 6D 0F
0000000010: 96 02 00 00 68 88 03 00 │ 40 A1 94 96 13 00 0C 52
0000000020: 4E 41 4C 49 41 53 5F 54 │ 45 58 54 04 43 4F 44 45
0000000030: 7E 98 07 00 28 54 00 02 │ 03 01 DF 8C 2C 00 06 5F
0000000040: 5F 70 61 72 63 00 09 5F │ 5F 63 68 6B 5F 73 79 6D
0000000050: 00 09 5F 5F 67 65 74 5F │ 73 79 6D 00 0B 5F 5F 57
0000000060: 6F 72 6B 61 72 65 61 73 │ 00 F2 90 0E 00 00 01 07
0000000070: 52 6E 41 6C 69 61 73 00 │ 00 00 B0 88 04 00 40 A2
0000000080: 01 91 A0 58 00 01 00 00 │ 56 55 8B EC 6A 01 9A 00
0000000090: 00 00 00 52 50 9A 00 00 │ 00 00 0B D2 74 3B 8E C2
00000000A0: 8B D8 33 F6 26 87 77 06 │ 6A 02 9A 00 00 00 00 52
00000000B0: 50 9A 00 00 00 00 8E C2 │ 8B D8 26 89 77 06 C1 E6
00000000C0: 02 74 16 C4 1E 00 00 26 │ 83 78 02 00 74 0B 26 C4
00000000D0: 18 26 89 47 06 26 89 57 │ 08 C9 5E CB 3C 9C 15 00
00000000E0: CC 07 56 01 CC 0E 56 02 │ CC 23 56 01 CC 2A 56 03
00000000F0: C4 3D 56 04 03 8A 02 00 │ 00 74

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 151
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет