PAC9 CTRL F1

Материал из Фабиус wiki
Перейти к: навигация, поиск

PAC9 CTRL_F1 - это создание накладной прихода сырья со склада по заказу НклСкл

if ISFORM_READONLY( , true )
  return
end

local msg, sr, sql, ga, mtr, repl, fld1, fld2, sklad, i, sr_rgnum, flt, pp, ;
  mtr_2, vl, m, mtr2, db, filt, rec, filt2, aa, t1, t2, id, sklad_shift, mtr1_rgnum

sklad := 0
sr_rgnum := {}
mtr_2 := {}
sklad_shift := '1'

try
  ga := GetArea()
  db := SaveStateDB()

  filt := DOCS1->( DbFilter() )
  filt2 := DOCS9->( DbFilter() )
  rec := DOCS1->( RecNo() )
  EnaDisControls( GetArea(), false )

  if Empty( DANAL2 )
    return
  endif
  sr := SelRows()
  if Empty( sr )
    if !YesNo( 'Сформировать накладную прихода сырья и материалов по всем изделиям?' )
      return
    endif
  else
    if !YesNo( 'Сформировать накладную прихода сырья и материалов по выделенным изделиям?' )
      return
    endif
  endif

  msg := WaitMsg( 'Подготовка данных' )

  sklad := ChoiceRefr( 'R10', 'KOD', { 'KOD', 'PNAME' }, "CodeGroup = '01'",, 'Выберите склад сырья' )
  if Empty( sklad )
    return
  endif

  id := InputDate()

  mtr := OPENCHILDDOC( 'MTR', '1', ~ParentForm := "", ~Year := Year( id ), ~Month := Month( id ) )

  ( mtr )->( SetFilter( "KINDDOC = 'MTR' and LVLNUM = '1' and DREFL1 = 'R10 ' and ;
    DANAL1 = " + ( ga )->DANAL1 + " and DSHIFT = '" + DtoS( id ) + ;
    iif( FactoryId = 'NAM', '2', ( ga )->( Right( DSHIFT, 1 ) ) ) + "' and CATTR5 = 'PAC9'" ) )

  if !Empty( ( mtr )->( IsSingle() ) )
    while !Empty( ( mtr )->( IsSingle() ) )
      ( mtr )->( TryToDelete() )
      ( mtr )->( DBSkip() )
    end
  endif
  // поля шапки MTR номер, дата, R10, код склада, R10, код производства, код мастера, дата + смена склада
  // дата + смена производства, 'PAC9', примечание
  fld1 := { "NUMDOC", "DATDOC", "KREFL1", "KANAL1", "DREFL1", "DANAL1", "DANAL3", "KSHIFT", "DSHIFT", "KSM_NUM", ;
    "DSM_NUM", "CATTR5", "PRIM" }

  if FactoryId = 'NAM'
    sklad_shift := '2'
  endif

  // добавили шапку
  mtr1_rgnum := ADDALL( 'MTR', '1', "",, fld1, ;
    { ( ga )->( { NUMDOC, id, 'R10 ', sklad, 'R10 ', DANAL1, val( cattr10 ), Left( KSHIFT, 8 ) + sklad_shift, ;
    iif( FactoryId = 'NAM', left( DSHIFT, 8 ) + '2', DSHIFT ), sklad_shift, ;
    iif( FactoryId = 'NAM', '2', Right( DSHIFT, 1 ) ), 'PAC9', ;
    'Автоматически сформировано по CTRL+F1 из заказа производству' } ) }, ;
    { | | Field->RGNUM }, ~Year := Year( id ), ~Month := Month( id ) )

  // NATTR3 - затребовано

  // поля 2-го уровня MTR код, количество, влажность, примечание
  fld2 := { "KANAL2", "AMNT", "CATTR7", "PRIM" }
  // соберем сырье Sql-запросом
  if Empty( sr )
    flt := [ and d9.Parent = '] + ( ga )->( PARENT ) + [' ]
  else
    for i := 1 to len( sr )
      ( ga )->( DBGoto( sr[i] ) )
      Aadd( sr_rgnum, ( ga )->RgNum )
    next
    flt := [ and d9.RgNUM in ( ] + ArrAsString2( sr_rgnum ) + [ ) ]
  endif
  sql := [ Select da.KANAL2, Sum( da.NATTR8 ) As AMNT ;
    From ] + ExpandReflPath( 'R08' ) + [ r08, ] + RetDbName( CurKindDoc ) + Ret_f_ext() + [ d9, ;
    ] + RetDbName( CurKindDoc ) + Ret_f_ext() + [ da ;
    Where r08.KOD = da.KANAL2 and d9.KINDDOC = 'PAC' and d9.LVLNUM = '9' and da.KANAL2 > 0 ;
      and da.NATTR8 > 0 and d9.RGNUM = da.PARENT ] + flt + [ and SKLAD_KOD in ( 0, ] + sklad + [ ) ;
    Group By da.KANAL2 ;
    Order By da.KANAL2 ]

  // добавляем сырье
  try
    pp := SelectSql( sql, OpdataPath )
    if Empty( ( pp )->( IsSingle() ) )
      Message( 'Сырье не найдено' )
      return
    endif
    while !( pp )->( eof() )
      // ищем влажность по коду сырья в PUBLIC массиве WetnsArr = { { коды }, { влажности }, ... }
      vl := 0
      if ( m := Ascan( WetnsArr[1], ( pp )->KANAl2 ) ) > 0
        vl := WetnsArr[2,m]
      endif
      Aadd( mtr_2, ( pp )->( { KANAL2, AMNT, vl, ;
        "Автоматически сформировано по Ctrl+F1 из производственного заказа"} ) )
      ( pp )->( DBSkip() )
    end

    if !Empty( mtr1_rgnum )
      AddAll( 'MTR', '2', mtr1_rgnum[1],, fld2, mtr_2, ;
        ~OwnerForm := ( mtr )->( GetForm( GetArea() ) ), ~Year := Year( id ), ~Month := Month( id ) )
    endif

  finally
    CloseTable( pp )
    mtr2 := OpenChildDoc( 'MTR', '2', mtr1_rgnum[1], ~ParentForm := ( mtr )->( GetForm( GetArea() ) ) )
    MakePrvs( mtr2->( GetArea() ),, 2 )
  end

  // теперь в цикле добавляем остальные накладные прихода со склада
  sql := [ Select DISTINCT SKLAD_KOD ;
    From ] + ExpandReflPath( 'R08' ) + [ r08, ] + RetDbName( CurKindDoc ) + Ret_f_ext() + [ d9, ;
      ] + RetDbName( CurKindDoc ) + Ret_f_ext() + [ da ;
    Where r08.KOD = da.KANAL2 and d9.KINDDOC = 'PAC' and d9.LVLNUM = '9' and da.KANAL2 > 0 ;
      and da.NATTR8 > 0 and d9.RGNUM = da.PARENT ] + flt + [ and SKLAD_KOD NOT in ( 0, ] + sklad + [ ) ]

  if FactoryId <> 'NAM'
    aa := SelectSqlToArr( sql, { 'SKLAD_KOD' }, OpdataPath )
  endif

  // в массиве aa записан список всех складов
  if !Empty( aa )
    for i := 1 to len( aa )
      // добавим шапку
      mtr1_rgnum := AddAll( 'MTR', '1', ,, fld1, { ( ga )->( { NUMDOC, DATDOC, 'R10 ', aa[i,1], ;
        'R10 ', DANAL1, val( cattr10 ), Left( KSHIFT, 8 ) + sklad_shift, DSHIFT, sklad_shift, ;
        Right( DSHIFT, 1 ), 'PAC9', 'Автоматически сформировано по Ctrl+F1 из заказа производству' } ) }, ;
        { | | Field->RGNUM } )

      // ищем сырье текущего склада
      sql := [ Select da.KANAL2, Sum( da.NATTR8 ) As AMNT ;
        From ] + ExpandReflPath( 'R08' ) + [ r08, ] + RetDbName( CurKindDoc ) + Ret_f_ext() + [ d9, ;
          ] + RetDbName( CurKindDoc ) + Ret_f_ext() + [ da ;
        Where r08.KOD = da.KANAL2 and d9.KINDDOC = 'PAC' and d9.LVLNUM = '9' and da.KANAL2 > 0 ;
          and da.NATTR8 > 0 and d9.RGNUM = da.PARENT ] + flt + [ and SKLAD_KOD = ] + aa[i,1] + [ ;
        Group By da.KANAL2 ;
        Order By da.KANAL2 ]

      mtr_2 := {}
      // добавляем сырье текущего склада
      try
        pp := SelectSql( sql, OpdataPath )
        if Empty( ( pp )->( IsSingle() ) )
          Message( 'Сырье не найдено' )
          return
        endif
        while !( pp )->( eof() )
          // ищем влажность по коду сырья в PUBLIC массиве WetnsArr = { { коды },{ влажности }, ... }
          vl := 0
          if ( m := Ascan( WetnsArr[1], ( pp )->KANAl2 ) ) > 0
            vl := WetnsArr[2,m]
          endif
          Aadd( mtr_2, ( pp )->( { KANAL2, AMNT, vl, "Автоматически сформировано по Ctrl+F1 из заказа производству" } ) )
          ( pp )->( DBSkip() )
        end

        if !Empty( mtr1_rgnum )
          AddAll( 'MTR', '2', mtr1_rgnum[1],, fld2, mtr_2, ;
            ~OwnerForm := ( mtr )->( GetForm( GetArea() ) ), ~Year := Year( id ), ~Month := Month( id ) )
        endif

      finally
        CloseTable( pp )
        mtr2 := OpenChildDoc( 'MTR', '2', mtr1_rgnum[1], ~ParentForm := ( mtr )->( GetForm( GetArea() ) ) )
        MakePrvs( mtr2->( GetArea() ),, 2 )
      end
    next
  endif

finally
  EnaDisControls( GetArea(), true )
  RestStateDb( db, ~AllGoTo := true )
  DOCS1->( SetFilter( filt ) )
  DOCS1->( DBGoTo( rec ) )
  DOCS9->( SetFilter( filt2 ) )
  HideMsg( msg )
end

Message( 'Накладная успешно сформирована' + Chr( 13 ) + ;
  'Просмотр накладной: Производство - Документы за смену - Сырье и материалы - Приходные накладные' )

Смотрите также

PAC