|
|
|
| Опять двадцать пять
В результате весеннего обострения получилась вот такая база типа склад: http://file.qip.ru/file/122715407/a2f465da/Frm.html
В процессе оприходования и списания товаров вычисляется УчетнаяЦена. Есть такая фишка как Резерв. Все бы хорошо... но при изменении статуса документа с Резерв на Списание УчетнаяЦена в документе, естественно, не меняется на актуальную.
Пробовал менять запросом на обновление:
1. Значение актуальная УчетнаяЦена брал из запроса "запДвижениеИтоги" Разумеется ничего не работает, т.к. запрос не обновляемый.
2. На основе "запДвижениеИтоги" делал табличную форму и брал значение из неё. Работает. Но весь документ обновляется на значение первой позиции из формы.
Чувствую, что опять все неправильно с самого начала - сама структура БД... Но может можно как то реализовать задуманное на том, что есть? | |
|
| |
|
|
|
| Я, просто спросить....
УчётнаяЦена - это чё такое?
И резерв - он КАК?Куда и пчему? | |
|
| |
|
|
|
| Учетная цена - это стоимость единицы товара на данный момент времени. Ведь один и тот же товар может поступать по разным ценам.
Резерв - это количество.
Например: получили 10 плюшек, продали/потеряли 3 - фактический остаток 7;
Марьвановна поросила отложить до конца недели 2 плюшки - свободный остаток 5.
2 плюшки числяться за Марьвановной по учетной цене на сегодня, к концу недели эта цена изменится. А когда я изменю статус документа Марьвановны с Резерв на Списание в нем в документе эта цена не поменяется - получится полное фуфло и ЧП
Как то так... | |
|
| |
|
|
|
| на Списание в нем в документе эта цена не поменяется -
==============================================
А почему бы в данный момент не сравнить цены на данный продукт и не спросить какую оставить, или не спрашивая - присвоить текущую цену списываемому продукту?
===================================
У Вас значение - код товара - имется во всех таблицах???
=========================================
По ID товара в справочнике товаров текущая цена - можно ведь запросом например или Dlook или DFirst | |
|
| |
|
|
|
| "...присвоить текущую цену списываемому продукту..."
Так в этом то и ?(вапрос) - как это сделать?
Сформулирую по другому. Открыл я какой-то документ, нажал на кнопашку - и все учетные цены в этом документе поменялись на актуальные на данный момент. Как?
Какомкверху - не предлагать | |
|
| |
|
|
|
| есть масса способов и кверху каком тоже есть=
=======================================
Можно так:
У докуммента имеется номер....
У списка товаров данного документа - тоже имеется его номер
Создаём запрос и выбираем все эти товары, которые нуна переоценить
Выбираем их в рекордсет1
рекордсет1.Open "SELECT ...... Where (табла.Номер_документа = Искомый_документ)
=========================
Далее бегая циклом по этому рекордсету,
Do
выбираем Dfirst( из справочника товаров тот товар, у которого ID = ID товара в рекордсет1 и берём Текущую цену из поля тек цена
Присваиваем её Рекордсет1.Цена=поле из справочника товаров ТекЦена
бежим дальше
Следующий товар
Нашли подходящее ID Проверили цену или сразу присвоили и фсе дела
цикл кончается
Loop
все переоценено... | |
|
| |
|
|
|
|
| с ЧАС погоди 5 хвилин.... | |
|
| |
|
|
|
| 'Dim rst As ADODB.Recordset
'Set rst = New ADODB.Recordset
'rst.Open "SELECT COMPONENT_TBL.* From COMPONENT_TBL WHERE (вот только условие я не знаю как у тебю в таблах там)"
'If rst.RecordCount <> 0 Then
' Do While Not rst.EOF '
'rst("Цена")= Dfirst(
' rst.MoveNext
' Loop
'End If
'rst.Close
'Set rst = Nothing
===========================
Запрос создай в конструкторе запросов задав от руки условие - потом скопируй этот запрос - строкой SQL в код
http://office.microsoft.com/ru-ru/access/HA012288231049.aspx | |
|
| |
|
|
|
| COMPONENT_TBL - это запрос с актуальными ценами? | |
|
| |
|
|
|
| Лучше прямо из справочника - потому как не нуно лишнего запроса, хотя как хочешь | |
|
| |
|
|
|
| DFirst("Тек_Цена","Справочник_Товаров", [rst.ID] ) | |
|
| |
|
|
|
| У... с ЧАС попробую Спасибо! | |
|
| |
|
|
|
| СтОООООООООООООООООООООйййй!!!!
Создаём запрос и выбираем все эти товары, которые нуна переоценить..." - COMPONENT_TBL ЭТО- Список товаров документа
==========================
и ещё надо библиотеку подключить
или ADO или dao
Для этих строк
'Dim rst As ADODB.Recordset
'Set rst = New ADODB.Recordset
'Dim rst As DAO.Recordset
'Set rst = New DAO.Recordset | |
|
| |
|
|
|
| В форме документ создал кнопку, на неё повесил:
Private Sub Кнопка57_Click()
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset
>> rst.Open "SELECT запТоварыВДокументе.* From запТоварыВДокументе"
If rst.RecordCount <> 0 Then
Do While Not rst.EOF '
rst("УчЦена") = DFirst("УчЦена", "запДвижениеИтоги", [rst.ID])
rst.MoveNext
Loop
End If
rst.Close
Set rst = Nothing
End Sub
Получаю сообщение:
Run-time error '3709'
Невозможно использование подключения для выполнения операции. Оно закрыто или не допускается в данном контексте.
Строка помеченная >> выделена желтым | |
|
| |
|
|
|
| а как туда мне попасть в форму документ?
=======================
Ой извини - надо
Docmd.openrecordset | |
|
| |
|
|
|
| Вот перезалил: http://file.qip.ru/file/122725842/f848d7e5/Frm2.html | |
|
| |
|
|
|
| C час вспомню как это в Access
rst.Open "select * from " & strTblName, CurrentProject.Connection | |
|
| |
|
|
|
| А запрос в конструкторе - выбирает нужное? | |
|
| |
|
|
|
|
Dim rst As New ADODB.Recordset
rst.Open "SELECT Движение.* " _
& " FROM Движение " _
& " WHERE (((Движение.КодДвж)=1));", CurrentProject.Connection
If rst.RecordCount <> 0 Then
Do While Not rst.EOF '
rst("УчЦена") = DFirst("УчЦена", "запДвижениеИтоги", [rst.ID])
rst.MoveNext
Loop
End If
rst.Close
Set rst = Nothing
|
| |
|
| |
|
|
|
| тока нужно выбрать реальное списание
WHERE (((Движение.КодДвж)=1)
|
вместо единички, а потом попробуеш - значение из формы засунуть | |
|
| |
|
|
|
| Ну а с чего б ему не выбирать...
Вот последняя версия: http://file.qip.ru/file/122727962/61b517db/Frm2.html
Теперь ругается: Отсутствует значение для одного или нескольких параметров | |
|
| |
|
|
|
| ты вставь - вон я тебе код бросил а кнопку 57
ругаться не будет
Dim rst As New ADODB.Recordset
rst.Open "SELECT Движение.* " _
& " FROM Движение " _
& " WHERE (((Движение.КодДвж)=1));", CurrentProject.Connection
If rst.RecordCount <> 0 Then
Do While Not rst.EOF '
rst("УчЦена") = DFirst("УчЦена", "запДвижениеИтоги", [rst.ID])
rst.MoveNext
Loop
End If
rst.Close
Set rst = Nothing
|
| |
|
| |
|
|
|
| а потом вот так
& " WHERE (((Движение.КодДвж)=" & me!ID & "));", CurrentProject.Connection
|
или как там
& " WHERE (((Движение.КодДвж)=" & Me!КодДкм & "));", CurrentProject.Connection | |
|
| |
|
|
|
| и обновить данные не забудь
me.recordsourse=me.recordsourse
или requery
илли refrech | |
|
| |
|
|
|
| Ну ты де???
А то мне обедать нуна.... | |
|
| |
|
|
|
| Извини пожалуйста! Надо было срочно убежать.
Нифига не получается - так я и зациклился на "Отсутствует значение для одного или нескольких параметров"
Додумался до такого:
rst.Open "SELECT Движение.* " & " FROM Движение " & " WHERE (((Движение.КодДкм)=[Forms]![Документ]![КодДкм]));", CurrentProject.Connection
|
Почему ты предлагаешь:
...WHERE (((Движение.КодДвж)=1))...
|
КодДвж - это вообще ничего не значащий код. Код операции. Нам же нужно товары по документу отобрать - т.е. КодДкм нужен. | |
|
| |
|
|
|
| конечно код документа
Это я достал из твоего кода - а там я в этих сокращениях не очень ..... | |
|
| |
|
|
|
| Так какого-ж... значения ему не хватает?
Запрос "SELECT Движение.* FROM Движение WHERE (((Движение.КодДкм)=[Forms]![Документ]![КодДкм]));" исправно возвращает позиции из документа.... | |
|
| |
|
|
|
| Я ж тебе говорю - поставь для начала цифирку - что бы проверить, а потом уже и значение из формы
И ещё - нуна для 100% - скопировать прямо из запроса иначе бывают глюки - када в ручную пишешь... | |
|
| |
|
|
|
| Поставил:
rst.Open "SELECT Движение.* FROM Движение WHERE (((Движение.КодДкм)=3));", CurrentProject.Connection
Теперь плюеётся на строчку:
rst("УчЦена") = DFirst("УчЦена", "запДвижениеИтоги", [rst.КодТвр]) 'код товара
приложению не удается найти поле I указанное в выражении | |
|
| |
|
|
|
| ужу лучше
[rst.КодТвр] - давай скобки нафиг - это же не имя поля в скобках целиком
или - rst("КодТвр") | |
|
| |
|
|
|
| Согласно синтаксису (всплывающая строка в редакторе) - все правильно.
На все другие варианты ругаецо: Expected - list separator or | |
|
| |
|
|
|
| Чево?
Msgbox rst.КодТвр - чё даёт? | |
|
| |
|
|
|
| И почему - текущую цену товара ищем в запДвижениеИтоги
а не в справочнике товаров?
по КодТвр | |
|
| |
|
|
|
| Чево?
Msgbox rst.КодТвр - чё даёт?
А чево? А как это "Msgbox rst.КодТвр"? В смысле обработчик ошибок на код кнопки 57 повесить?
И почему - текущую цену товара ищем в запДвижениеИтоги
а не в справочнике товаров?
А справочник и формируется из таблицы Товары и запДвижениеИтоги | |
|
| |
|
|
|
|
А чево? А как это "Msgbox rst.КодТвр"? В смысле обработчик ошибок на код кнопки 57 повесить?
|
Ну да - что бы программу не останвливать - она тебе всё может рассказать
Msgbox ами | |
|
| |
|
|
|
| Ну да ладно - чё сейчас - какой код в событии кнопки 57 - и на что ругань... | |
|
| |
|
|
|
| Да в общем то особо без изменений. Код такой:
Private Sub Кнопка57_Click()
On Error GoTo Кнопка57_Err
Dim rst As New ADODB.Recordset
rst.Open "SELECT Движение.* FROM Движение WHERE (((Движение.КодДкм)=3));", CurrentProject.Connection
If rst.RecordCount <> 0 Then
Do While Not rst.EOF
rst("УчЦена") = DFirst("УчЦена", "запДвижениеИтоги", [rst.КодТвр])
rst.MoveNext
Loop
End If
rst.Close
Set rst = Nothing
Кнопка57_Exit:
Exit Sub
Кнопка57_Err:
MsgBox Err.Description
Resume Кнопка57_Exit
End Sub
|
А ругань такая:
Приложению не удается найти поле I указанное в выражении.
|
И фсё! | |
|
| |
|
|
|
| Во блин!!!
Для проверки заменил строку:
rst("УчЦена") = DFirst("УчЦена", "запДвижениеИтоги", [rst.КодТвр])
|
строкой:
и получил:
Текущий объект Recordset не поддерживает обновление. Это связано с ограничением поставщика или с выбранным типом блокировки.
|
От чего бежали - к тому и прибежали: см. п.1. 1-го поста | |
|
| |
|
|
|
| надо добавить в конце строки
что то типа
, adOpenKeyset, adLockOptimistic
для VBA точно не знаю но способы блокировок и разрешений это причина надо добавитьконстанты блокировок и должно получится вот так
, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
|
иначе рекордсет будет не обновляем , извини - забыл...
и ещё [rst.КодТвр] - это не верно ОДНОЗНАЧНО! - пиши тада уж просто rst.КодТвр | |
|
| |
|
|
|
| DFirst("УчЦена", "запДвижениеИтоги", [rst.КодТвр])
как то так должно быть
DFirst("УчЦена", "запДвижениеИтоги", "[запДвижениеИтоги].[КодТвр]=" & [rst.КодТвр])
и еще
rst.update поставить перед rst.MoveNext | |
|
| |
|
|
|
| "надо добавить в конце строки что то типа: , CurrentProject.Connection, adOpenKeyset, adLockOptimistic иначе рекордсет будет не обновляем..."
Точно. Добавил - теперь обновляется
А вот дальше полная фигня!
Товары по документу отбираются только так:
rst.Open "SELECT Движение.* FROM Движение WHERE Движение.КодДкм=3;", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
|
Вот так:
st.Open "SELECT Движение.* FROM Движение WHERE Движение.КодДкм=Forms!Документ!КодДкм;", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
|
- не работает. Говорит: Отсутствует значение для одного или нескольких параметров. Т.е. КодДкм из формы (открытой) получить не могёт
Из рекордсета получить УчетнаяЦена тоже не могёт. Обновление работает только если задать параметр ручками (1):
Вот так:
rst("УчЦена") = DFirst("УчЦена", "запДвижениеИтоги", "[запДвижениеИтоги].[КодТвр]=" & [rst.КодТвр])
|
- не работает. Говорит: Приложению не удается найти поле I указанное в выражении
Пробовал разные варианты, читал многабукаф, танцевал бубен - не помогает...
Весь код сейчас выглядит вот так:
Private Sub Кнопка57_Click()
Dim rst As New ADODB.Recordset
rst.Open "SELECT Движение.* FROM Движение WHERE Движение.КодДкм=3;", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
If rst.RecordCount <> 0 Then
Do While Not rst.EOF
rst("УчЦена") = DFirst("УчЦена", "запДвижениеИтоги", "[запДвижениеИтоги].[КодТвр]=" & [rst.КодТвр])
rst.Update
rst.MoveNext
Loop
End If
rst.Close
Set rst = Nothing
DoCmd.RunCommand acCmdRefresh
End Sub
|
| |
|
| |
|
|
|
| Отбор по документу победил
Во как надо:
rst.Open "SELECT Движение.* FROM Движение WHERE Движение.КодДкм = " & Forms!Документ!КодДкм, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
|
| |
|
| |
|
|
|
|
| Ты уверен???
Чё_та судя по наименованиям-сокращениям - они каки_то не подходящие.....
=================================================================
Вот это мы понаписали - тута | |
|
| |
|
|
|
|
| "Вот это мы понаписали - тута"
Ну так мы же
| |
|
| |