Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi 2

Модерирует : ShIvADeSt

ShIvADeSt (22-03-2007 02:18): http://forum.ru-board.com/topic.cgi?forum=33&topic=8142  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

   

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжение темы http://forum.ru-board.com/topic.cgi?forum=33&topic=3647&start=2020#lt
Внимание, все большие куски кода (более 5 строк) оформляем в тег [more] дабы уменьшить размер поста.

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:52 20-04-2006 | Исправлено: ShIvADeSt, 02:02 30-06-2006
Arvur



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Sexton

Цитата:
если при проектировании базы изначально не была предусмотрена репликация, то ее туда уже не пришить
Неправда ваша, батенька Сделать можно все - вопрос в затраченных усилиях. Задача упрощается тем, что тут аплоад в одну сторону и центр один.

Цитата:
А чем, собственно, поможет перевод на Int64
Int64 имеет смысл как альтернатива парному ключу "код_клиента-код_записи". Вероятность выйти за диапазон мала и запросы проще.

Цитата:
Как гарантировать, чтобы одно и то же значение идентификатора записи не повторилось на разных рабочих местах?
Генерировать ключ в центральной базе в момент аплоада. А для локальных (не отправленных) записей использовать свой генератор. Для удобства выборок можно его крутить в минус.

Цитата:
Сливать ID пользователя с ID записи для меня было бы сложно и не логично.
Верю. Какой подход выбирать сильно зависит от специфики задачи. Я исхожу из описанных условий. Решать в итоге webgirlhb, глядя на проект
 
P.S. Насчет производительности - есть подозрение, что поиск по одному Int64-полю будет быстрее, чем по двум Int32 вне зависимости от логики проца. Но тестов Int64 я не видел.

Всего записей: 2111 | Зарегистр. 18-01-2002 | Отправлено: 06:15 14-10-2006
Sexton

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Arvur

Цитата:
Неправда ваша, батенька  Сделать можно все - вопрос в затраченных усилиях. Задача упрощается тем, что тут аплоад в одну сторону и центр один.

Ну тогда это задача по реализации "тонких" клиентов. А почему действительно не организовать промежуточное звено стандартными средствами? MIDAS (TClientDataSet) или RemObjects им в руки.
 
А репликация на неподготовленных для этого базах... Согласен по поводу усилий. Скажем так, усилия на реализацию репликации могут оказаться бОльшими, чем на перепроектирование. Я как-то автоматически думаю при проектировании таблиц, как их будет удобнее релицировать, если понадобится, и по каким правилам. Скажем документы надо реплицировать, но по каким правилам определять, какая версия записи "свежее" - рассматривается индивидуально. А всякие регистры (вычисляемые на основе документов данные) будут пересчитываться автоматически при репликации документов - отдельно их реплицировать не надо.
 
А чтобы выйти за пределы Int32 на учетной системе (если это не автоматический биллинг и иже с ними), надо постараться. Вряд ли 20-50 пользователям это под силу. Хотя, исключения, конечно, могут быть (или неправильное проектирование, когда при вводе пользователем одной записи в базе плодятся тысячи).

Цитата:
P.S. Насчет производительности - есть подозрение, что поиск по одному Int64-полю будет быстрее, чем по двум Int32 вне зависимости от логики проца. Но тестов Int64 я не видел.

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

Всего записей: 142 | Зарегистр. 31-05-2004 | Отправлено: 09:21 14-10-2006
SERGE_BLIZNUK

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Arvur

Цитата:
Как гарантировать, чтобы одно и то же значение идентификатора записи не повторилось на разных рабочих местах?  
Генерировать ключ в центральной базе в момент аплоада. А для локальных (не отправленных) записей использовать свой генератор. Для удобства выборок можно его крутить в минус.  

мне кажется, что вы не правы. Тогда в филиалах и центре будут разные базы.
 
Если делать хорошо и правильно, то нужно обязательно учитывать - принялась ли запись.
Повторять посылку до тех пор, пока не подтвердится.
У нас есть такая самописная система (СУБД Oracle). Схема "звезда". Обнвления идут не только в центральный узел, но и с него (даже так - через него). Все сделанные изменения через триггер пишутся в лог-журнал - по ниму и формуруются репликации.
А вот уникальные ключи ГОРАЗДО лучше (я бы даже сказал ОБЯЗАТЕЛЬНО) разделить по диапазонам - затраты минимальны (в сиквенс добавляется вначале код узла), а выгод - очень много!!!  
 
Хотя, согласен, много зависит от конкретной задачи.
 

Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 10:07 14-10-2006
Arvur



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
SERGE_BLIZNUK

Цитата:
нужно обязательно учитывать - принялась ли запись.

А транзакции на что? Если не обновилась - rollback

Цитата:
Обнвления идут не только в центральный узел

Вооот. Схема совсем другая. Тут, наверное, с уместностью доп. полей я соглашусь
 
З.Ы. Я, вроде, сразу оговорился что пропагандирую схему для конкретной задачи? Все написанное мной имеет смысл, когда записи от одного клиента видны только ему и центру. Ну и обновления справочников от центра идут всем.

Всего записей: 2111 | Зарегистр. 18-01-2002 | Отправлено: 20:32 14-10-2006
SERGE_BLIZNUK

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Arvur

Цитата:
нужно обязательно учитывать - принялась ли запись.

Цитата:
А транзакции на что? Если не обновилась - rollback  

или вы не понимаете чего-то, или я... ;-))
Какой rollback - вопрос, откуда в филиале базу будет знать, какие записи принялись, а какие нет? или при rollback сформируется пакет для филиала, в котором будет указан ID записи? А если пакет из филиала ВООБЩЕ не дошел до центра? Что будет выступать в качестве подтверждения?
Впрочем, кажется, я догадался, что вы имеете в виду - клиент филиала коннектится напрямую в центральную БД на сервере и  выполняет добавление по одной записи, так?
Просто у нас нет прямой связи (пакеты идут опосредственно через SMTP/POP).
 
И ещё, мне кажется, что автор, задавший вопрос не принимает участие в дискуссии ;-))
А мне, так же как и вам - реализовывать репликации вроде бы незачем... ;-))

Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 21:26 14-10-2006
Arvur



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
SERGE_BLIZNUK

Цитата:
клиент филиала коннектится напрямую в центральную БД на сервере

Именно так.  
 
Да. Подождем автора, а то скоро на статью настучим

Всего записей: 2111 | Зарегистр. 18-01-2002 | Отправлено: 21:48 14-10-2006
SERGE_BLIZNUK

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Arvur

Цитата:

Цитата:
Обнвления идут не только в центральный узел  
Вооот. Схема совсем другая. Тут, наверное, с уместностью доп. полей я согл

забыл добавить - в нашем случае дополнительных полей НЕТ! Есть триггеры на каждой таблице (на insert/update/delete), которые пишут в доп.базу - LOGJOURNAL, что изменилось. Есть таблица  
- журнал, в котором фиксируется кому какая запись из логжурнала была отправлена-подтверждена.
 

Цитата:
Да. Подождем автора, а то скоро на статью настучим

;-) похоже на то. ;-)

Всего записей: 2014 | Зарегистр. 12-09-2002 | Отправлено: 22:25 14-10-2006 | Исправлено: SERGE_BLIZNUK, 22:31 14-10-2006
vserd

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Arvur

Цитата:
передавать ему метод класса в качестве потоковой функции  
 
Интересная тема... Можешь проиллюстрировать примером кода?  

http://forum.ru-board.com/topic.cgi?forum=33&topic=5223&start=17&limit=1

Всего записей: 2065 | Зарегистр. 08-05-2002 | Отправлено: 15:12 16-10-2006
rs

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
подскажите, пожалуйста,как можно изменить дату последнего обращения файла из дельфи?
 
есть вот такой код:
 
procedure TForm1.Button1Click(Sender: TObject);
var
  FileHandle: Integer;
  dt1,dt2,dt3:PFileTime;
const
  FileName = 'C:\1.tst';
begin
  getmem(dt1,sizeof(dt1));
  getmem(dt2,sizeof(dt1));
  getmem(dt3,sizeof(dt1));
  FileHandle := FileOpen(FileName, fmOpenWrite or fmShareDenyNone);
  if FileHandle > 0 then begin
    GetFileTime(FileHandle, dt1, dt2, dt3);
    SetFileTime(FileHandle, dt1, dt1, dt1);
    end;
  FileClose(FileHandle);
  freemem(dt1);
  freemem(dt2);
  freemem(dt3);
end;
 
по идее все три даты (создания, изменения, открытия) должны стать равными дате создания - однако дата доступа таким образом не изменяется
 
как решить проблему?

Всего записей: 1344 | Зарегистр. 19-04-2003 | Отправлено: 16:21 16-10-2006 | Исправлено: rs, 16:32 16-10-2006
DroN_S

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
подскажите, пожалуйста,как можно изменить дату последнего обращения файла из дельфи

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

Код:
 
function SetFileDate(Const FileName : String; Const FileDate : TDateTime): Boolean;
var
 FileHandle        : THandle;
 FileSetDateResult : Integer;
begin
 try
  try
   FileHandle := FileOpen
      (FileName,
       fmOpenWrite OR fmShareDenyNone);
   if FileHandle > 0 Then  begin
    FileSetDateResult :=
      FileSetDate(
        FileHandle,
        DateTimeToFileDate(FileDate));
      result := (FileSetDateResult = 0);
    end;
  except
   Result := False;
  end;
 finally
  FileClose (FileHandle);
 end;
end;
 

у меня работает

Всего записей: 1143 | Зарегистр. 09-04-2005 | Отправлено: 17:18 16-10-2006
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
что означает директива в исходнике?
 
{%File 'filename.pas'}

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 17:32 16-10-2006
rs

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DroN_S

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

Всего записей: 1344 | Зарегистр. 19-04-2003 | Отправлено: 18:13 16-10-2006 | Исправлено: rs, 18:15 16-10-2006
DroN_S

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
rs
в общем, скажи одно, что тебе нуждно изменить:
дату создания?
дату изменения?
дату открытия?
ФАЙЛА!!!!

Всего записей: 1143 | Зарегистр. 09-04-2005 | Отправлено: 18:18 16-10-2006
rs

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DroN_S
дату открытия (LastAccess)

 
Добавлено:
DroN_S
я просто сразу показал в примере, что методом SetFileTime именно ЭТА дата почему-то и не меняется

Всего записей: 1344 | Зарегистр. 19-04-2003 | Отправлено: 18:30 16-10-2006
DroN_S

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
rs
а через FileSetDate не пробывал

Всего записей: 1143 | Зарегистр. 09-04-2005 | Отправлено: 18:47 16-10-2006
rs

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DroN_S
хех
а ларчик просто открывался - нужно просто убрать  
  FileClose(FileHandle);

 
хотя во всех найденных примерах в сети стоит именно закрытие(!) файла - но именно нормальное закрытие и сбрасывает дату последнего доступа к файлу, установленную в моей программе
 
однако возникает вопрос - ресурс FileHandle надо же всё-таки освободить? ведь при сканировании десятков тысяч файлов будет вызван десятки тысяч раз метод    
  FileHandle := FileOpen  
и ни разу закрытие хэндлов
 
количество занятой (неосвобождённой памяти), наверное будет расти с каждым открытием новго файла при их массовомй обработке?
 
как правильно освободить память после FileOpen без закрытия файла FileClose
 
Добавлено:
DroN_S
Цитата:
а через FileSetDate не пробывал
меняется только дата создания

Всего записей: 1344 | Зарегистр. 19-04-2003 | Отправлено: 18:52 16-10-2006 | Исправлено: rs, 18:58 16-10-2006
OOD

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
не подскажете исходник просого джойнера на делфи?
такой чтобы 2 Exe Разбивал на какой нибуть стринг , а потом по очереди собирал их и запускал...

Всего записей: 3378 | Зарегистр. 20-05-2006 | Отправлено: 19:00 16-10-2006
DroN_S

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OOD
тобишь тебе надо разбить файл на яасти, а потом его склеить воедино обратно?
rs
круто

Всего записей: 1143 | Зарегистр. 09-04-2005 | Отправлено: 19:23 16-10-2006
rs

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DroN_S
а как с этим быть:

Цитата:
количество занятой (неосвобождённой памяти), наверное будет расти с каждым открытием новго файла при их массовомй обработке?  
 
как правильно освободить память после FileOpen без закрытия файла FileClose

 
я ж не могу бросать незакрытыми десятки тысяч хэндлов...
 
Добавлено:
какой-нибудь FreeHandle вместо FileClose - освободить хэндл без закрытия файла... нет такого?

Всего записей: 1344 | Зарегистр. 19-04-2003 | Отправлено: 19:26 16-10-2006
DroN_S

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
я ж не могу бросать незакрытыми десятки тысяч хэндлов...

так ты можешь закрывать только хэндл окна
CloseHandle(FileHandle)

Всего записей: 1143 | Зарегистр. 09-04-2005 | Отправлено: 19:32 16-10-2006
   

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi 2
ShIvADeSt (22-03-2007 02:18): http://forum.ru-board.com/topic.cgi?forum=33&topic=8142


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru