Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.07.31;
Скачать: [xml.tar.bz2];

Вниз

Как правильно сделать ID документа с префиксом (ЖАС-3420)?   Найти похожие ветки 

 
jiny   (2005-06-21 12:41) [0]

Сейчас проблема следующая :
раньше поле ID было Integer на триггере Before Insert(GEN_ID),
сейчас возникла необходимость сделать ID  с префиксом, так как собираемся установить программу в филиалы (но об этом в следующем вопросе). ID должен быть следующего вида :
Префикс||"-"||Значение_генератора, например :
ЖАС-27345
Поле ID сейчас VARCHAR(30) CHARACTER SET WIN1251
Изменил код триггера на новый :
 new.id=new.id||"-"||cast(gen_Id(newNumFr1_1,1) as Varchar(20)  character set win1251);
потом пробовал так :
 new.id=cast(new.id as varchar(5) character set win1251)||CAST("-" as varchar(1) character set win1251)||cast(gen_Id(newNumFr1_1,1) as Varchar(20)  character set win1251);
При вводе данныхвыдает ошибку :
DataType conversion error, перед Commit записи устанавливаю ID="ЖАС"
Помогите, чем смогите ?)


 
Sergey13 ©   (2005-06-21 12:50) [1]

А не лучше сделать второе поле, которое будет ссылаться на справочник филиалов или чего у вас там? Его соответственно добавить в ключ.

ЗЫ:Репликацией занимаетесь? Там все намного сложнее, ИМХО, чем просто сменить тип ключа.


 
Johnmen ©   (2005-06-21 12:50) [2]

1. Почему же ID символьного типа ??? Кто научил ?
2. Чётко разделяя принципы хранения и отображения, добавь поле, где будешь хранить ЖАС.


 
alexeis ©   (2005-06-21 12:51) [3]

А че филиалы на сделать отдельным полем?
И выборки по ним легче будет сделать


 
jiny   (2005-06-21 13:17) [4]

ID символьного типа научил 1С :), насчет Johnmen ©   (21.06.05 12:50) [2] (2) - можно подумать,

а насчет :
<<А че филиалы на сделать отдельным полем?
И выборки по ним легче будет сделать>>

хочу что нить универсальное, тем более что пересчет остатков  товаров у меня делается по заранее предопределенным критериям, полям, единственное, при смене текущего склада меняю аналитику по полю NUM_MAINFIRM, где оно означает номер текущего склада(филиала)
Не думаю что это как то повлияет на правильность работы,
т.к. я уже в ДЕМО базе переделал все поля на VARCHAR(30)
попробовал погонять справочник товаров, вроде не ругается, работает быстро, остатки пересчитывает "на лету"
P.S. просто возникла необходимость репликации баз данных офиса с филиалами, вот и хочу каждому префикс присвоить и экспортировать/импортировать записи без боязни нарушения уникальности, хотя если действительно добавить поле Prefix и сделать Primary index "ID,prefix" может че и получиться. Обложился статьями по репликации с ibase.ru и парюсь.


 
alexeis ©   (2005-06-21 16:35) [5]

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


 
Sergey13 ©   (2005-06-21 16:45) [6]

2[4] jiny   (21.06.05 13:17)
Тогда у тебя скорее не репликация, а механическое сложение баз какое то получитя. И построить суммарный отчет по всем филиалам вряд ли получится.


 
jiny   (2005-06-22 08:38) [7]

alexeis ©   (21.06.05 16:35) [5]
а можно поподробней, какие именно изменения, если есть выход подскажи, хотя бы наметки. В принципе, я не против второго поля PRefix.

2[4] jiny   (21.06.05 13:17)
Честно говоря, четкой схемы репликации или какого либо конкретного решения как правильно делать репликацию никто еще не придумал, так даже в статьях пишут на Ibase.ru, это просто один из вариантов, я никому его не навязываю, просто рассматриваю как один из вариантов.
<И построить суммарный отчет по всем филиалам вряд ли получится>
Это почему же ?! Объясни свою позицию.


 
alexeis ©   (2005-06-22 08:56) [8]

а можно поподробней, какие именно изменения
Изменения в движении товаров за определенный период по определенному филиалу.


 
jiny   (2005-06-22 09:14) [9]

Ну я так и собирался делать, только вот в чем загвоздка :
Движения товаров за опр.период передаются в виде документов, на основании которых осуществлялась реализация товаров с филиала и если скажем переносить их доткументы в общую базу с аналитикой обозначенной как филиал, то возникает вопрос :
Документ у меня состоит из двух таблиц : Шапка и Список, так вот если шапку документа филиала воткнуть в таблицу Офиса, пусть даже с уникальным номером офиса, добавив дополнительное поле ID_CHILD, где указать оригинальный ID филиала, нужно также перекинуть само движение товара, с тем же самым ID, что получили в процессе BeforeInsert триггера таблицы Офиса, а это я себе не вполне представляю, только если перехватить значение генератора Офиса, в TIBdataSet.GeneratorField, пока с ним не работал, надо пробануть.
Тут прочитал в статье, что можно предопределить значения генераторов заранее, то-есть : Офис : с 1, Филиал1 : с 2000000, Филиал2 : с 4000000 и т.д. Но это тоже не выход, рано или поздно возникнет конфликт уникальности.
Надо что-нить универсальное, чтобы не сильно менять/нарушать логику прекрасно работающей программы и базы и в тоже время чтобы все:  и офис и филиалы подчинялись одним правилам работы и могли совмещать друг друга, пусть даже с помощью механического сложения таблиц.


 
Danilka ©   (2005-06-22 09:54) [10]

[4] jiny   (21.06.05 13:17)
> ID символьного типа научил 1С

ню-ню. путаешь ИД и код справочника (номер документа).
Ид в 1с-ке совсем-совсем другое, без всяких префиксов.

[9] jiny   (22.06.05 09:14)

> Тут прочитал в статье, что можно предопределить значения
> генераторов заранее, то-есть : Офис : с 1, Филиал1 : с 2000000,
> Филиал2 : с 4000000 и т.д. Но это тоже не выход, рано или
> поздно возникнет конфликт уникальности.

Еще один вариант - приращение и начальное смещение.
Например, знаешь, что филиалов полюбому будет меньше 100 (ну или 1000).
Ну и делай приращение генератора на 100 или на тысячу, офис начинай с 1, филиал1 начинай с 2 и т.д. тогда второй сгенеренный ИД для офиса будет равен 101, третий - 201, для филиала1 = 102, 202 и т.д.


 
Sergey13 ©   (2005-06-22 09:55) [11]

2[7] jiny   (22.06.05 08:38)
><И построить суммарный отчет по всем филиалам вряд ли получится>
>Это почему же ?! Объясни свою позицию.

Суммарный отчет можно построить когда инфа опирается на единые справочники. Т.е. коды едины для всех записей всех филиалов. Если ты собираешься сливать инфу с использованием идентификатора филиала, то, как я понял, и справочники будут сливаться так же. Т.е. условно говоря в одном филиале 10 код это зарплата, во втором это основные материалы и т.д. Имеем полную ссылочную целостность (данные одного филиала ссылаются на "свои" справочные данные) и полный раздрай в целом. Надо или сопоставлять справочники или еще чего.

Я не утверждаю что это будет именно так, ибо не знаком в деталях с твоей ситуацией, но сейчас мне твоя ситуация видится именно такой.


 
jiny   (2005-06-22 10:26) [12]

Суммарный отчет можно построить когда инфа опирается на единые справочники. Т.е. коды едины для всех записей всех филиалов.
Согласен

Если ты собираешься сливать инфу с использованием идентификатора филиала, то, как я понял, и справочники будут сливаться так же.
Нет, справочник товаров, контрагентов, городов, регионов и прочих
"Константных" для всех филиалов справочников будет неизменным и вводится будет только в базе офиса, потом будет делаться отгрузка данных из этих справочников всем филиалам, и обратного хода эта информация иметь не будет.

С филиала будет сливаться только информация о хозяйственных операциях, проплатах(как по банку, так и по кассе)
Т.е. в Офисе будут видеть их остатки, опираясь на их документы, так как во всех опреациях справочник товаров и т.п. будет единым.

Сейчас попробовал добавить поле Prefix, пересоздал Примари индекс : ID,Prefix, вроде все получается, но столько кода переворошить надо :( и  один вопрос : не знаю как лучше создать индекс (очередность) : Integer,Varchar или Varchar,Integer вроде принципиально скорость выборки не меняется, кто его знает при больших объемах насколько эффективна будет та или иная последовательность в индексе, может кто-нить подскажет ?


 
jiny   (2005-06-22 10:29) [13]

Danilka ©   (22.06.05 09:54) [10]
в принципе, я уже думал об этом, надо попробовать, я так понял, сначала нунопреобразовать оба числа в VArchar, затем сцепить и обратно в Integer. Идея интересная. Пробану


 
Sergey13 ©   (2005-06-22 10:31) [14]

2[12] jiny   (22.06.05 10:26)
Тогда уже проще.
Но наличие например "товаров" или "контрагентов" в списке "Константных" справочников вселяет недоверие. А что филиалы сами то делают?


 
Danilka ©   (2005-06-22 10:36) [15]

[13] jiny   (22.06.05 10:29)
> я так понял, сначала нунопреобразовать оба числа в VArchar

НЕТ! :)
все гораздо проще.
для каждого филиала создай генератор со своим начальным смещением, только отличающимся от предыдущего филиала не на два мильена, а на единицу.
а далее делай приращение не единицу, а, например, 100. Не помню точно как в ИБ ты получаешь значение генератора, что-то вроде GEN_ID("my_generator_name", 100);
вот и все. :)
100 можешь писать не напрямую число, а использовать какую-нибудь таблицу констант и брать оттуда. на всякий случай. что не пришлой в какой-то момент, когда ты захочешь изменить 100 на 200, например, крячить кучу триггеров.


 
jiny   (2005-06-22 10:40) [16]

Danilka Еще один вариант - приращение и начальное смещение.
Например, знаешь, что филиалов полюбому будет меньше 100 (ну или 1000).
Ну и делай приращение генератора на 100 или на тысячу, офис начинай с 1, филиал1 начинай с 2 и т.д. тогда второй сгенеренный ИД для офиса будет равен 101, третий - 201, для филиала1 = 102, 202 и т.д.

И сразу же поправка к вышесказанному, ограниченность количества филиало : 8 филиалов, учитывая, что офис займет 1 (2-9)
надо что-нить другое, но я щас прорабатываю демо-версию с доп полем prefix, посмотрим, что получиться


 
Danilka ©   (2005-06-22 10:45) [17]

[16] jiny   (22.06.05 10:40)
если боишься, что кол-во филиалов может быть очень-очень большим, ну поставь приращение миллион. стока филиалов ты не наберешь, полюбому. :)
с учетом того, что генератор 64 битный (это-же так, я ничего не напутал?), то, для кажого филиала твой диапазон ИД-шников будет = 2^64 / 1 000 000 = 18 446 744 073 709
вполне достаточно. :))


 
jiny   (2005-06-22 10:47) [18]


> Sergey13 ©   (22.06.05 10:31) [14]
> 2[12] jiny   (22.06.05 10:26)
> Тогда уже проще.
> Но наличие например "товаров" или "контрагентов" в списке
> "Константных" справочников вселяет недоверие. А что филиалы
> сами то делают

Филиалы не покупают товар и юр или физ лиц, поставка товаров осуществляется по их заказу с головняка в соответствии с документами о внутреннем перемещении по складам.
Поэтому, вводить новые наименования у них нет нужды,
но ЕСТЬ ОДНА ЗАГВОЗДКА :
они имеют право продавать товар как физ лицам(в розницу), это ладно, ведь контрагентов заводить не надо, но также имеют право отпускать товар по документам юр.лицам, поэтому возникет потребность вводить контрагентов. Но если просто представить, что контрагент, который всегда получал товар в офисе, решил получить его в филиале, ну вдруг что-то срочно и филиал тут под боком, допустим. Они введут его как своего контрагента, соответственно, в офисе, не найдут движения по этому же контрагенту в их базе, Получиться, что в базе офиса будут два контрагента с одинаковым наименованием, как в этом случае быть ?


 
Danilka ©   (2005-06-22 10:48) [19]


> ограниченность количества филиало : 8 филиалов

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


 
jiny   (2005-06-22 10:50) [20]

Danilka ©   (22.06.05 10:45) [17]
ну спасибо, буду теперь париться, хотя твоя идея мне наиболее симпатична, т.е. программа, равно как и база  не потребует конструктивной переработки


 
jiny   (2005-06-22 10:55) [21]

Danilka ©   (22.06.05 10:48) [19]  
запарился, ошибочка вышла, ты прав


 
Sergey13 ©   (2005-06-22 10:56) [22]

2 [18] jiny   (22.06.05 10:47)
> как в этом случае быть ?
Писать процедуру согласования справочников и сажать на это человека. Я по другому не знаю. 8-)


 
jiny   (2005-06-22 10:58) [23]

Кто-нить знаком как репликация в 1С ? Как она сделана, вроде работает без проблем (с самого начала надо было поинтересоваться :)


 
Danilka ©   (2005-06-22 15:05) [24]

[23] jiny   (22.06.05 10:58)
Если имеется ввиду УРДБ (есть еще МОД, более сложный, но, как говорят, намного более функциональный, правда я с ним не работал), то там есть отдельная таблицу, куда пишутся ИД-шники измененных объектов. Когда ты делаешь выгрузку в другую базу, то выгружаются эти объекты, плюс связанные с ними. Да, там еще для каждого справочника или документа в конфигураторе настраиваются правила миграции, вроде такие: "для всех баз", "только для базы где объект создан", "для базы где создан и для главной".



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2005.07.31;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.04 c
4-1117438560
Гость2
2005-05-30 11:36
2005.07.31
Как добавить иконку в заголовок окна?


9-1113489380
П7
2005-04-14 18:36
2005.07.31
Быстрый 2D рендеринг без OpenGL, DirectX и компонетов


1-1120974311
Tab
2005-07-10 09:45
2005.07.31
чтение unicode строк из ini файлов


4-1117696152
rolex
2005-06-02 11:09
2005.07.31
Как получить путь к папке Documents and Settings ???


10-1098286030
GanibalLector
2004-10-20 19:27
2005.07.31
"как бы" утечка ...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский