20.01.2009, 12:09 | #1 |
Участник
|
Господа специалисты, скажите пожалуйста:
1. можно ли реализовать импорт данных в разные фирмы? То есть чтобы, например, из одного файла с данными они по определенному признаку раскидывались по разным фирмам. 2. можно ли реализовать автоматический Учет импортированных инвойсов из п.1? Если возможно, пожалуйста, приведите примеры кода. Заранее всем спасибо. |
|
20.01.2009, 13:21 | #2 |
Участник
|
1. Ну а почему нет? В файле достаточно указать фирмы для заголовков документов
2. Можно. Кодеюнит вызываемый при нажатии кнопки "Учёт" смотреть не пробовали? Он маленький |
|
20.01.2009, 13:40 | #3 |
Участник
|
Дело в том, что наши специалисты утверждают, что это невозможно. Насколько я понял, невозможно написать код, который бы открывал нужную фирму, импортировал в нее инвойсы и учитывал их.
Собираются даже брать специального человека, который бы вручную открывал фирму, импортировал туда инвойсы и учитывал их. Затем открывал другую фирму и т.д. |
|
20.01.2009, 13:54 | #4 |
Участник
|
Инвойсы в данном случае это лишь данные в файле, которые должны импортироваться в соответствующие таблицы. Для переменной типа Record есть метод CHANGECOMPANY, позволяющий работать с записями соответствующей таблицы, но для любой другой фирмы того же сервера.
С учётом чуть сложнее. Тут нужно будет зайти в каждую фирму и вызвать механизм автоучёта для импортированных в неё инвойсов. |
|
20.01.2009, 14:36 | #5 |
MCTS
|
Не все так однозначно.
Некоторые данные действительно загрузить в разные фирмы достаточно просто, используя для этого метод CHANGECOMPANY. Примером может послужить, тот же импорт курсов валют, включенный FP1 для NAV5. А вот с документами сложнее, т.к. требуется выполнить присвоение номера из серии номеров. Не могу сказать как сейчас, но в версии 4.0, номер выдавался из серии принадлежащей текущей компании, а не указанной в CHANGECOMPANY. |
|
20.01.2009, 14:53 | #6 |
Участник
|
Ну если использовать серию номеров и прочее, то никто не мешает загружать не сразу в заказы, а сперва в некоторые промежуточные таблицы, а создание непосредственно документов, как и учёт вызывать заходя в каждую фирму.
|
|
20.01.2009, 15:16 | #7 |
MCTS
|
Цитата:
Но если для создания и учета нужно заходить в каждую компанию, так может и загрузку тоже выполнять для каждой компании отдельно |
|
20.01.2009, 15:21 | #8 |
Участник
|
Насколько я помню достаточно вынести все используемые методы в таблицу, тогда они будут выполнятся в контексте указанной в changecompany фирмы.
К примеру: SalesHeader.changecompany(newCompany); SalesHeader.init; SalesHeader."No.':=NosMgt.InitSeries.... вернет номерок и серии номеров текущей фирмы. В случае: SalesHeader.init; SalesHeader."No.' SalesHeader.insert(true) - код в триггере OnInsert присвоит номер из серии номеров фирмы newCompany. В вашем gega случае просто пишется функция по автоучету в 36 таблице. Код может выглядет примерно так: Function Autopost(var lSH record 36) begin if lSH.find('-') then repeat if codeunit.run(codeunit::"Sales Post", lSH) then; until lSH.next=0; end; Вызов примерно так: lSH.changecompany(newCompany); ...устанавливаем фильтры lSH.autopost(lSH); |
|
20.01.2009, 16:10 | #9 |
MCTS
|
А строки как добавить?
И insert(true), тоже не дался - берет серийные номера из текущей компании. |
|
20.01.2009, 17:24 | #10 |
Участник
|
Цитата:
Цитата:
С учётом чуть сложнее. Тут нужно будет зайти в каждую фирму и вызвать механизм автоучёта для импортированных в неё инвойсов.
|
|
20.01.2009, 17:31 | #11 |
Участник
|
Цитата:
Года 3 назад разруливали похожую проблему - делали некое подобие мультифирменного учета. Разрулили как сейчас вспомнил частично передачей имени фирмы по части таблиц и кодеюнитов (вот почему insert(true) работал , частично обработчиком. В нужной фирме создавались только заголовки доков, документ в текущей фирме кидался в квоту продажи (исключительно заголовок и строки без валидэйтов и триггеров). Далее в нужной фирме вызывался обработчик, который тянул данные из исходной фирмы с честными валидэйтами. |
|
20.01.2009, 18:38 | #12 |
Administrator
|
Цитата:
Сообщение от gega
Дело в том, что наши специалисты утверждают, что это невозможно. Насколько я понял, невозможно написать код, который бы открывал нужную фирму, импортировал в нее инвойсы и учитывал их.
Собираются даже брать специального человека, который бы вручную открывал фирму, импортировал туда инвойсы и учитывал их. Затем открывал другую фирму и т.д. но взять специального человека наверное будет дешевле... |
|
21.01.2009, 18:59 | #13 |
Участник
|
А мне кажется, что можно реализовать следующим образом:
Написать программку или батник, который будет по ссылке открывать некий отчет или форму в нужной фирме. В форме или отчете зашита логика импорта данных. Или же в том же наве сделать подобный финт, и не писать батник. |
|
22.01.2009, 14:32 | #14 |
Участник
|
Или открыть в где-нибудь в терминале кол-во окон навижен, соответствующее кол-ву фирм и в каждом быть в соответствующей и иметь запущеной форму, которая по таймеру будет периодически опрашивать какую-либо папку на предмет загрузки файлов. Запустить всю эту фигную как раз можно батником тем же.
|
|
22.01.2009, 15:30 | #15 |
MCTS
|
Цитата:
Сообщение от grif
Или открыть в где-нибудь в терминале кол-во окон навижен, соответствующее кол-ву фирм и в каждом быть в соответствующей и иметь запущеной форму, которая по таймеру будет периодически опрашивать какую-либо папку на предмет загрузки файлов. Запустить всю эту фигную как раз можно батником тем же.
UPD http://www.mibuso.com/dlinfo.asp?FileID=924 - это чтобы запустить JobQueue для множества компаний с помощью только двух NAS (не проверял). |
|
04.02.2009, 15:59 | #16 |
Участник
|
Почти спам - сегодня случайно наткнулся на 406 кодеюнит и строки:
Код: CASE TableID OF DATABASE::"Reason Code": WITH ReasonCode DO IF CopyTable THEN BEGIN CHANGECOMPANY(NewCompanyName); IF FIND('-') THEN REPEAT CHANGECOMPANY(COMPANYNAME); INSERT(TRUE); CHANGECOMPANY(NewCompanyName); UNTIL NEXT = 0; END; ... DATABASE::Family: WITH Family DO IF CopyTable THEN BEGIN CHANGECOMPANY(NewCompanyName); IF FIND('-') THEN REPEAT CHANGECOMPANY(COMPANYNAME); INSERT(TRUE); CHANGECOMPANY(NewCompanyName); UNTIL NEXT = 0; END; |
|