BEST logo логотип компании БЭСТ - программы для бизнеса ПРОДАЖИ
+7 (991) 312-04-37
trade@bestnet.ru
ПОДДЕРЖКА
+7 (495) 775-66-76
consult@bestnet.ru
СКАЧАТЬ
Обновления
Дистрибутивы
Авторизация

Логин:
Пароль:
Забыли свой пароль?
Регистрация
ВАШ ВОПРОС

Доступ к Личному кабинету закрыт!
Как получить доступ?


Главная  / Поддержка  / Форум  / Публичные форумы  / Программирование отчетов  / к Дмитрию Шлыкову огромная просьба

Форум

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
к Дмитрию Шлыкову огромная просьба, bda.s_maker STROKI в АРМе УПРАВЛЕНИЕ ПРОДАЖАМИ
 
можно ли в стандартном источнике данных bda.s_maker STROKI в АРМе УПРАВЛЕНИЕ ПРОДАЖАМИ
добавить поля из картотеки "СТЕЛЛАЖ" И "ЯЧЕЙКА"

на печатных формах в УПРАВЛЕНИИ ПРОДАЖАМИ надо адрес выводить
SQL-запрос по mkart - делается очень долго
Код
SELECT
rbookm.sclad as код_склада,
rbookm.dopcode as ном_док,
rbookm.grup as группа,
rbookm.nnum as номер,
rbookm.partia as код_партии,
mkart.mesto1 as место1,
mkart.mesto2 as место2
FROM real\rbookm as rbookm
LEFT JOIN sclad\mkart as mkart on (rbookm.sclad=mkart.sclad and rbookm.grup=mkart.grup and rbookm.nnum=mkart.nnum and rbookm.partia=mkart.partia)
Where rbookm.dopcode=:номер_заказа
Order by группа,номер,код_партии

потом массивами вывожу адреса в masterdata - НО ВСЕ ЭТО ФОРМИРУЕТСЯ ОЧЧЕНЬ ДОЛГО

второй вариант
создаю свой источник данных в спецфункции с событием "проверка документа"
Код
private aStruOP,cFileOP,cNameOP,aStruADRES,cFileADRES,cNameADRES
PRIVATE aSetKey 
aSetKey:=SaveSetKey()
DBPUSH("MDOCM","RBOOKM",,{MDOCM->DOPCODE,MDOC->DOPCODE})
MDOCM->(f_SetRelation("MKART","UPPER(Grup+NNum+Partia+Sclad)"))
aStruOP := {}
  aAdd(aStruOP,{"VarName","C",20,0})
  aAdd(aStruOP,{"VarC","C",20,0})
  aAdd(aStruOP,{"FieldName","C",10,0})
cFileOP := "adres_op.dbf"
cNameOP := GlobalTmpPath+cFileOP
DBCreate(cNameOP,aStruOP)
aStruADRES := {}
  aAdd(aStruADRES,{"Sclad","C",6,0})
  aAdd(aStruADRES,{"Status","C",1,0})
  aAdd(aStruADRES,{"Grup","C",5,0})
  aAdd(aStruADRES,{"Nnum","C",13,0})
  aAdd(aStruADRES,{"Partia","C",5,0})
  aAdd(aStruADRES,{"Name","C",60,0})
  aAdd(aStruADRES,{"Mesto1","C",10,0})
  aAdd(aStruADRES,{"Mesto2","C",10,0})
cNameADRES :=LOADPATH()+"\real\adres.dbf"
DBCreate(cNameADRES,aStruADRES)
NetUse("ADRES_op",cNameOP)
ADDREC()
ADRES_op->VarName :="Заголовок"
ADRES_op->VarC :="Движение ТМЦ"
DbUnlock()
  ADDREC()
  ADRES_op->VarName :="Склад"
  ADRES_op->FieldName :="SCLAD"
  DbUnlock()
  ADDREC()
  ADRES_op->VarName :="Статус"
  ADRES_op->FieldName :="STATUS"
  DbUnlock()
  ADDREC()
  ADRES_op->VarName :="Группа"
  ADRES_op->FieldName :="GRUP"
  DbUnlock()
  ADDREC()
  ADRES_op->VarName :="Номер"
  ADRES_op->FieldName :="NNUM"
  DbUnlock()
  ADDREC()
  ADRES_op->VarName :="Партия"
  ADRES_op->FieldName :="PARTIA"
  DbUnlock()
  ADDREC()
  ADRES_op->VarName :="НаименованиеТМЦ"
  ADRES_op->FieldName :="NAME"
  DbUnlock()
  ADDREC()
  ADRES_op->VarName :="Место1"
  ADRES_op->FieldName :="MESTO1"
  DbUnlock()
  ADDREC()
  ADRES_op->VarName :="Место2"
  ADRES_op->FieldName :="MESTO2"
  DbUnlock()
ADRES_op->(dbClosearea()) 
NetUse("ADRES",cNameADRES)
WHILE MDOCM->( !EOF() )
            ADRES->(AddRec())
            ADRES->SCLAD   := MKART->SCLAD
            ADRES->STATUS  := MKART->STATUS
            ADRES->GRUP    := MKART->GRUP
            ADRES->NNUM    := MKART->NNUM
            ADRES->PARTIA  := MKART->PARTIA
            ADRES->NAME    := MKART->NAME
            ADRES->MESTO1  := MKART->MESTO1
            ADRES->MESTO2  := MKART->MESTO2
            ADRES->(F_DBUNLOCK())
  MDOCM->(DBSKIP())
ENDDO
ADRES->(dbClosearea())
DbPop()
RestSetKey(aSetkey)
но и здесь проблемы
во-первых по уму такой adres.dbf надо бы создавать во временной папке локально у пользователя например в C:\TEMP ИЛИ DBCreate(GlobalTmpPath+"adres.dbf",aStru)
(а не в общей папке \DBASE\REAL )
но тогда в SQL-запросе я не смогу обратиться к этому dbf-файлу
во вторых если я оставляю создание этого файла в папке с базой данных то при работе нескольких пользователей появляются проблемы

короче говоря вариант с собственным источником данных НЕ ГОДИТСЯ

ОПИСАНИЕ СОЗДАННОГО ИНТЕРФЕЙСА ЗАПОЛНЕНИЯ АДРЕСОВ БЕЗОПАСНО НЕ ЗАТРАГИВАЯ НАЧАЛЬНЫЙ ОСТАТОК В КАТОТЕКЕ:

1) создаём пункт меню в АРМе "ТОВАРЫ.ГОТОВАЯ ПРОДУКЦИЯ"
для этого добавляем в файл C:\B4_PLUS\DBASE\SCLAD\s_menu.dbf
строку
MENUNOMER,C,10===0
PROMPTNOME,C,3===12
MENUPROMPT,C,44==АДРЕС
MENUMESSEG,C,80==АДРЕСНЫЙ УЧЕТ
MENUBLOCK,C,100=={||HFileEval("adres2.hrb",{})}

2)
ДЛЯ ВОЗМОЖНОСТИ ПОИСКА СОЗДАЁМ ДОПОЛНИТЕЛЬНЫЙ ИНДЕКС
в файл C:\B4_PLUS\DBASE\SCLAD\bases_03.dbf
добавляем строку
ARM,C,2==============03
PATH_DBF,C,20========SCLAD\
NAME_DBF,C,10========MKart
TAG_NOMER,C,2========27
TAG_NAME,C,10========MKart_adr
INDEX,C,85===========UPPER(Status+Sclad+Mesto1+Mesto2+Grup+NNum+Partia)
MESSAGE,C,40=========Картотека
FOR_KEY,C,180========!EMPTY(NNum)
WHILE_KEY,C,10=======
DELETE,L=============ИСТИНА
PACK,L===============ЛОЖЬ
YES_INDEX,L==========ИСТИНА
CRC,N,10,0
ID_ST,N,4,0
USER_CODE,C,6

3)
теперь для появления такого нового индекса проиндекируем выборочно модуль ТОВАРЫ...
ИНДЕКС И ПУНКТ МЕНЮ ГОТОВЫ
есть только маленькая проблема при включенной авторизации при нескольких предприятий в "картотеке предприятий" и использовании справочника меню в настройке->картотеке->авторизации пользователей->справочник меню

в этом случае надо менять файл C:\B4_PLUS\DBASE\SCLAD\s_menu.dbf
в той базе которая в карточке предприятий стоит в самом верху то есть в самой первой независимо от того какой код предприятия 00001 или 00060.
и не забудьте с правочнике меню обновить меню клавишей "ALT-M"

4) код для компиляции adres2.hrb
ниже приведенный код (НАПРИМЕР В ВИДЕ ФАЙЛА adres2.prg) надо скопировать в папку C:\B4_PLUS\pro\plugins\source\SCLAD
скомпилировать его - для этого
зайти в арм ТОВАРЫ... далее в "работа с картотекой"->"номенклатурный справочник"
нажать CTRL+F5 и затем F11
открыть adres2.prg и скомпилировать нажав F2

все можно работать в новом модуле адресного учета ТМЦ на складах
без опасности изменить начальный остаток и текущее количество.

полный код adres2.prg приведу в следующем сообщении ниже
 
Код
FUNCTION Main()
private kodsclada
aSet:=SAVESET()
aSetKey:=SAVESETKEY()
NETUSE("MKART",LOADPATH()+"\SCLAD\MKART.dbf",,.F.)
NETUSE("MSCLAD",LOADPATH()+"\SCLAD\msclad.dbf",,.F.)
//нам надо только по двум складам - поэтому фильтр
msclad->(dbSetFilter({||(msclad->code='    95').or.(msclad->code='    99')}))
DO WHILE SELECTSCLAD(.T.).AND.ADRES(.T.)
ENDDO
MKART->( DBCLOSEAREA() )
MSCLAD->( DBCLOSEAREA() )
RESTSETKEY(aSetKey)
RESTSET(aSet)
RETURN NIL

FUNCTION SELECTSCLAD()
LOCAL aSet,aSetKey,nTop,nBot,cColHead,aBlockCols,cCurProc,aHeads,nUniMode,bDel,bScrInit,aSortSeek
//задание параметров первой прямоугольной области
msclad->(DBGOTOP())

DISPBOX(2,0,7,79,( CHR( 201 ) + CHR( 205 ) + CHR( 187 ) + CHR( 186 ) + CHR( 188 ) + CHR( 205 ) + CHR( 200 ) + CHR( 186 )+' ' ) ,"W+/B")
//задание параметров второй прямоугольной области
DISPBOX(8,0,23,79,( CHR( 201 ) + CHR( 205 ) + CHR( 187 ) + CHR( 186 ) + CHR( 188 ) + CHR( 205 ) + CHR( 200 ) + CHR( 186 )+' ' ) ,"W+/B")
//01.nTop - верхняя строка 
nTop:=3
//02.nBottom - нижняя строка 
nBot:=6
//03.cColHead -  строка или массив строк - заголовок над полями 
cColHead:={"Код склада     Наименование склада"}
//04.Заголовки колонок реестра
aBlockCols:={ {{||FIELD->code},0},{{||FIELD->SHORTNAME},15} }
//05.cCurProc - сопроцедура для QBrowse() cCurProc:={||0}
cCurProc:={||movecursor1()}
//06._aHeads - Описание полей ввода 
aHeads:={{"код склада...............","code"},;
         {"Наименование склада......","SHORTNAME"}}
//11._nUniMode - режим проверки на уникальность
nUniMode:=2
//12.Запрещение удаления в таблице
bDel:={||.F.}
//13.запрет ввода новой записи и корректировки старой
bScrInit:={||If((nApp=2.OR.nApp=1),0,1)}

SHADOWBOX("ENTER:Выбор склада"+CHR(205)+CHR(205)+CHR(205)+CHR(205)+CHR(205)+CHR(205)+CHR(205)+CHR(205)+CHR(205)+"ESC:Выход",7,23,7,62,"B/G")

MSCLAD->( INITLIST(nTop,nBot,cColHead,aBlockCols,cCurProc,;
aHeads,,,,,;
nUniMode,bDel,bScrInit))

RETURN LASTKEY()!=27


FUNCTION ADRES()
LOCAL aSet,aSetKey,nTop,nBot,cColHead,aBlockCols,cCurproc,aHeads,bDel,aWhen,aPic,nUniMode,bScrInit,aSortSeek,cFindMacro
mkart->(ORDSETFOCUS("mkart_sn"))
scopeexpr:=" "+kodsclada
mkart->(SetScope("UPPER(Status+Sclad)",scopeexpr))
mkart->(DBGOTOP())
//удаление будет запрещено
bDel:={||.F.}
//Описание полей ввода
aHeads:={{"Место1...:","mesto1"},;
         {"Место2...:","mesto2"}}
//11._nUniMode - режим проверки на уникальность
nUniMode:=2
//13.запрет ввода новой записи по F4 - И - запрет корр-ки без номера или без партии или закрытых карточек
bScrInit:={||If(nApp=2.OR.(nApp=1.AND.(EMPTY(MKART->NNUM).OR.EMPTY(MKART->PARTIA).OR.!EMPTY(MKART->STATUS))),0,1)} 

aSortSeek:={;
{"- по группам,н/номерам ТМЦ  ",{"Группа.....","Н/номер....","Партия....."},{"right(grup,4)","nnum","partia"},"UPPER(scopeexpr+' '+aIn[1]+aIn[2]+aIn[3])",,,,"mkart_sn"},;
{"- по местам хранения        ",{"Место1.....","Место2....."},{"mesto1","mesto2"},"UPPER(scopeexpr+aIn[1]+aIn[2])",,,,"mkart_adr"}}

nTop:=9
nBot:=22
cColHead:={"СкладГруппа  Номер    Партия   НАИМЕНОВАНИЕ      Кол   Место1     Место2     С"}
cCurProc:={||movecursor2()}

aBlockCols:={{{||RIGHT(FIELD->sclad,2)},0},{{||FIELD->grup},2},{{||FIELD->nnum},8},{{||FIELD->partia},22},{{||LEFT(FIELD->NAME,20)},28},{{||STR(FIELD->koltek,5)},49},{{||FIELD->mesto1},55},{{||FIELD->mesto2},66},{{||FIELD->status},77}}

//SHADOWBOX("ENTER:Изменить адрес"+CHR(205)+CHR(205)+CHR(205)+"F3:Сортировка"+CHR(205)+CHR(205)+CHR(205)+"F6:Фильтр"+CHR(205)+CHR(205)+CHR(205)+"F7:поиск",23,10,23,60,"B/G")
SHADOWBOX("ENTER:Изменить адрес"+CHR(205)+CHR(205)+CHR(205)+CHR(205)+CHR(205)+CHR(205)+"F6:Фильтр"+CHR(205)+CHR(205)+CHR(205)+"F7:поиск",23,10,23,60,"B/G")

mkart->( INITLIST(nTop,nBot,cColHead,aBlockCols,cCurProc,;
aHeads,,aPic,aWhen,,;
nUniMode,bDel,bScrInit,aSortSeek,,;
,,))
RETURN LASTKEY()!=9

//Функция N1 перемещения из перечня складов по ENTER
FUNCTION movecursor1()
LOCAL m1end
IF LASTKEY()=13
    SETLASTKEY(0)
    m1End:=0
    kodsclada:=msclad->code
ELSE
    m1End:=2
ENDIF
RETURN m1end

//Функция N2 возврат к перечню складов
FUNCTION movecursor2()
LOCAL m2end
IF LASTKEY()=9
    SETLASTKEY(0)
    m2End:=0
ELSE
    m2End:=2
ENDIF
RETURN m2end
 
забыл добавить - все это на
BEST4+ 12.01 SP42
 
Добрый день!
Цитата
denlog пишет:
можно ли в стандартном источнике данных bda.s_maker STROKI в АРМе УПРАВЛЕНИЕ ПРОДАЖАМИдобавить поля из картотеки "СТЕЛЛАЖ" И "ЯЧЕЙКА"
Вопроcы по доработке программ лучше размещать в разделе "БЭСТ-4+" данного форума.
Цитата
denlog пишет:
но тогда в SQL-запросе я не смогу обратиться к этому dbf-файлуво вторых если я оставляю создание этого файла в папке с базой данных то при работе нескольких пользователей появляются проблемы
короче говоря вариант с собственным источником данных НЕ ГОДИТСЯ
Думаю, что данный вариант решения Вашей задачи самый оптимальный. По Вашему Вопросу смотрите: http://www.bestnet.ru/support/forum/index.php?PAGE_NAME=read&FID=9&TID=111&MID=s
Страницы: 1
Читают тему (гостей: 1)