Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Про склад и цены
 
 автор: Alex   (15.03.2010 в 10:53)   личное сообщение
 
 

Опять двадцать пять
В результате весеннего обострения получилась вот такая база типа склад: http://file.qip.ru/file/122715407/a2f465da/Frm.html
В процессе оприходования и списания товаров вычисляется УчетнаяЦена. Есть такая фишка как Резерв. Все бы хорошо... но при изменении статуса документа с Резерв на Списание УчетнаяЦена в документе, естественно, не меняется на актуальную.
Пробовал менять запросом на обновление:
1. Значение актуальная УчетнаяЦена брал из запроса "запДвижениеИтоги" Разумеется ничего не работает, т.к. запрос не обновляемый.
2. На основе "запДвижениеИтоги" делал табличную форму и брал значение из неё. Работает. Но весь документ обновляется на значение первой позиции из формы.
Чувствую, что опять все неправильно с самого начала - сама структура БД... Но может можно как то реализовать задуманное на том, что есть?

  Ответить  
 
 автор: час   (15.03.2010 в 11:14)   личное сообщение
 
 

Я, просто спросить....
УчётнаяЦена - это чё такое?
И резерв - он КАК?Куда и пчему?

  Ответить  
 
 автор: Alex   (15.03.2010 в 11:28)   личное сообщение
 
 

Учетная цена - это стоимость единицы товара на данный момент времени. Ведь один и тот же товар может поступать по разным ценам.
Резерв - это количество.
Например: получили 10 плюшек, продали/потеряли 3 - фактический остаток 7;
Марьвановна поросила отложить до конца недели 2 плюшки - свободный остаток 5.
2 плюшки числяться за Марьвановной по учетной цене на сегодня, к концу недели эта цена изменится. А когда я изменю статус документа Марьвановны с Резерв на Списание в нем в документе эта цена не поменяется - получится полное фуфло и ЧП
Как то так...

  Ответить  
 
 автор: час   (15.03.2010 в 11:36)   личное сообщение
 
 

на Списание в нем в документе эта цена не поменяется -
==============================================
А почему бы в данный момент не сравнить цены на данный продукт и не спросить какую оставить, или не спрашивая - присвоить текущую цену списываемому продукту?
===================================
У Вас значение - код товара - имется во всех таблицах???
=========================================
По ID товара в справочнике товаров текущая цена - можно ведь запросом например или Dlook или DFirst

  Ответить  
 
 автор: Alex   (15.03.2010 в 11:43)   личное сообщение
 
 

"...присвоить текущую цену списываемому продукту..."
Так в этом то и ?(вапрос) - как это сделать?
Сформулирую по другому. Открыл я какой-то документ, нажал на кнопашку - и все учетные цены в этом документе поменялись на актуальные на данный момент. Как?
Какомкверху - не предлагать

  Ответить  
 
 автор: час   (15.03.2010 в 11:47)   личное сообщение
 
 

есть масса способов и кверху каком тоже есть=
=======================================
Можно так:
У докуммента имеется номер....
У списка товаров данного документа - тоже имеется его номер
Создаём запрос и выбираем все эти товары, которые нуна переоценить
Выбираем их в рекордсет1
рекордсет1.Open "SELECT ...... Where (табла.Номер_документа = Искомый_документ)
=========================
Далее бегая циклом по этому рекордсету,
Do
выбираем Dfirst( из справочника товаров тот товар, у которого ID = ID товара в рекордсет1 и берём Текущую цену из поля тек цена
Присваиваем её Рекордсет1.Цена=поле из справочника товаров ТекЦена
бежим дальше
Следующий товар
Нашли подходящее ID Проверили цену или сразу присвоили и фсе дела
цикл кончается
Loop
все переоценено...

  Ответить  
 
 автор: Alex   (15.03.2010 в 11:57)   личное сообщение
 
 

"...У докуммента имеется номер....
У списка товаров данного документа - тоже имеется его номер
Создаём запрос и выбираем все эти товары, которые нуна переоценить..."
- это я могу

"...Выбираем их в рекордсет1. Далее бегая циклом по жтому рекордсету выбираем Dfirst( из справочника товаров тот товар, у которого ID = ID товара в рекордсет1 и берём Текущую цену из поля тек цена Присваиваем её Рекордсет1.Цена=поле из справочника товаров ТекЦена..."
Вместо справочника товаров будет запрос с актуальными ценами. Тоже понятно.
А вот рекордсеты и циклы...
Час!!! Если Вас не затруднит, может набросаете примерчик У меня целая куча умных книжек, интернет и форум. Я их периодически читаю, но все равно туплю

  Ответить  
 
 автор: час   (15.03.2010 в 11:58)   личное сообщение
 
 

с ЧАС погоди 5 хвилин....

  Ответить  
 
 автор: час   (15.03.2010 в 11:59)   личное сообщение
 
 

'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

  Ответить  
 
 автор: Alex   (15.03.2010 в 12:07)   личное сообщение
 
 

COMPONENT_TBL - это запрос с актуальными ценами?

  Ответить  
 
 автор: час   (15.03.2010 в 12:10)   личное сообщение
 
 

Лучше прямо из справочника - потому как не нуно лишнего запроса, хотя как хочешь

  Ответить  
 
 автор: час   (15.03.2010 в 12:07)   личное сообщение
 
 

DFirst("Тек_Цена","Справочник_Товаров", [rst.ID] )

  Ответить  
 
 автор: Alex   (15.03.2010 в 12:09)   личное сообщение
 
 

У... с ЧАС попробую Спасибо!

  Ответить  
 
 автор: час   (15.03.2010 в 12:11)   личное сообщение
 
 

СтОООООООООООООООООООООйййй!!!!
Создаём запрос и выбираем все эти товары, которые нуна переоценить..." - COMPONENT_TBL ЭТО- Список товаров документа
==========================
и ещё надо библиотеку подключить
или ADO или dao
Для этих строк
'Dim rst As ADODB.Recordset
'Set rst = New ADODB.Recordset


'Dim rst As DAO.Recordset
'Set rst = New DAO.Recordset

  Ответить  
 
 автор: Alex   (15.03.2010 в 12:25)   личное сообщение
 
 

В форме документ создал кнопку, на неё повесил:

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'
Невозможно использование подключения для выполнения операции. Оно закрыто или не допускается в данном контексте.

Строка помеченная >> выделена желтым

  Ответить  
 
 автор: час   (15.03.2010 в 12:51)   личное сообщение
 
 

а как туда мне попасть в форму документ?
=======================
Ой извини - надо
Docmd.openrecordset

  Ответить  
 
 автор: Alex   (15.03.2010 в 13:01)   личное сообщение
 
 

Вот перезалил: http://file.qip.ru/file/122725842/f848d7e5/Frm2.html

  Ответить  
 
 автор: час   (15.03.2010 в 13:01)   личное сообщение
 
 

C час вспомню как это в Access

rst.Open "select * from " & strTblName, CurrentProject.Connection

  Ответить  
 
 автор: час   (15.03.2010 в 13:15)   личное сообщение
 
 

А запрос в конструкторе - выбирает нужное?

  Ответить  
 
 автор: час   (15.03.2010 в 13:18)   личное сообщение
 
 


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

  Ответить  
 
 автор: час   (15.03.2010 в 13:21)   личное сообщение
 
 

тока нужно выбрать реальное списание

WHERE (((Движение.КодДвж)=1)


вместо единички, а потом попробуеш - значение из формы засунуть

  Ответить  
 
 автор: Alex   (15.03.2010 в 13:22)   личное сообщение
 
 

Ну а с чего б ему не выбирать...
Вот последняя версия: http://file.qip.ru/file/122727962/61b517db/Frm2.html
Теперь ругается: Отсутствует значение для одного или нескольких параметров

  Ответить  
 
 автор: час   (15.03.2010 в 13:23)   личное сообщение
 
 

ты вставь - вон я тебе код бросил а кнопку 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 

  Ответить  
 
 автор: час   (15.03.2010 в 13:27)   личное сообщение
 
 

а потом вот так

& " WHERE (((Движение.КодДвж)=" & me!ID & "));", CurrentProject.Connection 


или как там
& " WHERE (((Движение.КодДвж)=" & Me!КодДкм & "));", CurrentProject.Connection

  Ответить  
 
 автор: час   (15.03.2010 в 13:31)   личное сообщение
 
 

и обновить данные не забудь
me.recordsourse=me.recordsourse
или requery
илли refrech

  Ответить  
 
 автор: час   (15.03.2010 в 13:32)   личное сообщение
 
 

Ну ты де???
А то мне обедать нуна....

  Ответить  
 
 автор: Alex   (15.03.2010 в 18:28)   личное сообщение
 
 

Извини пожалуйста! Надо было срочно убежать.
Нифига не получается - так я и зациклился на "Отсутствует значение для одного или нескольких параметров"
Додумался до такого:

rst.Open "SELECT Движение.* " & " FROM Движение " & " WHERE (((Движение.КодДкм)=[Forms]![Документ]![КодДкм]));", CurrentProject.Connection

Почему ты предлагаешь:

...WHERE (((Движение.КодДвж)=1))...

КодДвж - это вообще ничего не значащий код. Код операции. Нам же нужно товары по документу отобрать - т.е. КодДкм нужен.

  Ответить  
 
 автор: час   (15.03.2010 в 18:44)   личное сообщение
 
 

конечно код документа
Это я достал из твоего кода - а там я в этих сокращениях не очень .....

  Ответить  
 
 автор: Alex   (15.03.2010 в 18:51)   личное сообщение
 
 

Так какого-ж... значения ему не хватает?
Запрос "SELECT Движение.* FROM Движение WHERE (((Движение.КодДкм)=[Forms]![Документ]![КодДкм]));" исправно возвращает позиции из документа....

  Ответить  
 
 автор: час   (15.03.2010 в 19:04)   личное сообщение
 
 

Я ж тебе говорю - поставь для начала цифирку - что бы проверить, а потом уже и значение из формы
И ещё - нуна для 100% - скопировать прямо из запроса иначе бывают глюки - када в ручную пишешь...

  Ответить  
 
 автор: Alex   (15.03.2010 в 19:20)   личное сообщение
 
 

Поставил:
rst.Open "SELECT Движение.* FROM Движение WHERE (((Движение.КодДкм)=3));", CurrentProject.Connection

Теперь плюеётся на строчку:
rst("УчЦена") = DFirst("УчЦена", "запДвижениеИтоги", [rst.КодТвр]) 'код товара

приложению не удается найти поле I указанное в выражении

  Ответить  
 
 автор: час   (15.03.2010 в 19:26)   личное сообщение
 
 

ужу лучше
[rst.КодТвр] - давай скобки нафиг - это же не имя поля в скобках целиком
или - rst("КодТвр")

  Ответить  
 
 автор: Alex   (15.03.2010 в 19:32)   личное сообщение
 
 

Согласно синтаксису (всплывающая строка в редакторе) - все правильно.
На все другие варианты ругаецо: Expected - list separator or

  Ответить  
 
 автор: час   (15.03.2010 в 19:34)   личное сообщение
 
 

Чево?

Msgbox rst.КодТвр - чё даёт?

  Ответить  
 
 автор: час   (15.03.2010 в 19:35)   личное сообщение
 
 

И почему - текущую цену товара ищем в запДвижениеИтоги
а не в справочнике товаров?

по КодТвр

  Ответить  
 
 автор: Alex   (15.03.2010 в 20:06)   личное сообщение
 
 

Чево?
Msgbox rst.КодТвр - чё даёт?

А чево? А как это "Msgbox rst.КодТвр"? В смысле обработчик ошибок на код кнопки 57 повесить?

И почему - текущую цену товара ищем в запДвижениеИтоги
а не в справочнике товаров?

А справочник и формируется из таблицы Товары и запДвижениеИтоги

  Ответить  
 
 автор: час   (15.03.2010 в 20:09)   личное сообщение
 
 


А чево? А как это "Msgbox rst.КодТвр"? В смысле обработчик ошибок на код кнопки 57 повесить?


Ну да - что бы программу не останвливать - она тебе всё может рассказать
Msgbox ами

  Ответить  
 
 автор: час   (15.03.2010 в 20:10)   личное сообщение
 
 

Ну да ладно - чё сейчас - какой код в событии кнопки 57 - и на что ругань...

  Ответить  
 
 автор: Alex   (15.03.2010 в 20:29)   личное сообщение
 
 

Да в общем то особо без изменений. Код такой:


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 указанное в выражении.


И фсё!

  Ответить  
 
 автор: Alex   (15.03.2010 в 21:04)   личное сообщение
 
 

Во блин!!!
Для проверки заменил строку:

rst("УчЦена") = DFirst("УчЦена", "запДвижениеИтоги", [rst.КодТвр])

строкой:

rst("УчЦена") = 111

и получил:

Текущий объект Recordset не поддерживает обновление. Это связано с ограничением поставщика или с выбранным типом блокировки.

От чего бежали - к тому и прибежали: см. п.1. 1-го поста

  Ответить  
 
 автор: час   (15.03.2010 в 21:48)   личное сообщение
 
 

надо добавить в конце строки
что то типа
, adOpenKeyset, adLockOptimistic
для VBA точно не знаю но способы блокировок и разрешений это причина надо добавитьконстанты блокировок и должно получится вот так

, CurrentProject.Connection, adOpenKeyset, adLockOptimistic


иначе рекордсет будет не обновляем , извини - забыл...

и ещё [rst.КодТвр] - это не верно ОДНОЗНАЧНО! - пиши тада уж просто rst.КодТвр

  Ответить  
 
 автор: snipe   (16.03.2010 в 01:28)   личное сообщение
 
 

DFirst("УчЦена", "запДвижениеИтоги", [rst.КодТвр])
как то так должно быть
DFirst("УчЦена", "запДвижениеИтоги", "[запДвижениеИтоги].[КодТвр]=" & [rst.КодТвр])

и еще
rst.update поставить перед rst.MoveNext

  Ответить  
 
 автор: Alex   (19.03.2010 в 13:37)   личное сообщение
 
 

"надо добавить в конце строки что то типа: , 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("УчЦена") = 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

  Ответить  
 
 автор: Alex   (19.03.2010 в 15:02)   личное сообщение
 
 

Отбор по документу победил
Во как надо:

rst.Open "SELECT Движение.* FROM Движение WHERE Движение.КодДкм = " & Forms!Документ!КодДкм, CurrentProject.Connection, adOpenKeyset, adLockOptimistic

  Ответить  
 
 автор: Alex   (19.03.2010 в 16:03)   личное сообщение
 
 

Все победил
Во как надо:

rst("УчЦена") = DFirst("УчЦена", "запДвижениеИтоги", "запДвижениеИтоги.КодТвр = " & rst("ТоварИмяКрт"))

  Ответить  
 
 автор: час   (19.03.2010 в 18:01)   личное сообщение
 
 

Ты уверен???
Чё_та судя по наименованиям-сокращениям - они каки_то не подходящие.....
=================================================================
Вот это мы понаписали - тута

  Ответить  
 
 автор: Alex   (19.03.2010 в 20:28)   личное сообщение
 
 

Апсалютна
Во: http://file.qip.ru/file/123222214/aa6a1fd/Frm.html
Можешь проверить

  Ответить  
 
 автор: Alex   (20.03.2010 в 13:39)   личное сообщение
 
 

"Вот это мы понаписали - тута"
Ну так мы же

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList