Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Access VBA

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68

Открыть новую тему     Написать ответ в эту тему

Guest

BANNED
Редактировать | Цитировать | Сообщить модератору
   
 
Обсуждаем вопросы только по Access VBA
(программирование макросов, скриптов, пользовательских функций и т.п.).
Приветствуются ссылки на ресурсы и справочную литературу по теме.

 

NB! Дублирующая тема VBA for Access закрыта во избежание путаницы. Оставлена эта, как более ранняя и имеющая больше сообщений.

Смежные темы:
Помощь в создании SQL-запросов: SQL запрос
Программы » Microsoft Office 2019 & 365 | 2016 | 2013 | 2010 | 2007 | 2003
Программы » OneNote | Outlook 2013 & 2016 & 2019 | Outlook 2010 | Microsoft Mathematics & Math Solver
Программы » Word FAQ | Excel FAQ | Access FAQ
Прикладное программирование » Word VBA | Excel VBA
Андеграунд » Microsoft Office 2019 | 2016 | 2013 | 2010 | 2007 | 2003
Андеграунд » OneNote | Visio | SharePoint Server | Project Server | Exchange Server
Андеграунд » Надстройки (add-ins) и коммерческие макросы Excel
Андеграунд » Самостоятельная сборка дистрибутивов Оffice 2007/2010/2013/2016 | MUI для Office 2007
----------
Как в Access перместить запись из одной таблицы в другую (допустим по нажатию кнопки на форме)?

Отправлено: 18:31 05-09-2002 | Исправлено: ALeXkRU, 17:14 03-08-2021
LuckyELF

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот код:
 
Private Sub Form_Open(Cancel As Integer)
    On Error GoTo Err_Form_Open
     
    Dim sFind_SQL, sID_CHECK
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
     
    If IsNull(Forms!fmEDIT_CHECK.OpenArgs) Then
        DoCmd.Close
        Exit Sub
    End If
     
     
    sID_CHECK = Forms!fmEDIT_CHECK.OpenArgs
         
    sFind_SQL = "SELECT T_CHECK.ID_CHECK, T_CHECK.ALT_NUMBER, R_CHECK_DIR.CHECK_DIR_NAME, " & _
        "R_CHECK_TYPE.CHECK_TYPE_NAME, T_CHECK.BEG_PROV_PERIOD, T_CHECK.END_PROV_PERIOD, " & _
        "T_CHECK.BEG_PROV_DATE, T_CHECK.END_PROV_DATE, T_CHECK.PRIKAZ_N, T_CHECK.PRIKAZ_DATE, " & _
        "T_CHECK.INFO_DATE, T_CHECK.OUT_DATE " & _
        "FROM R_CHECK_DIR INNER JOIN " & _
        "(R_CHECK_TYPE INNER JOIN T_CHECK ON R_CHECK_TYPE.ID_CHECK_TYPE = T_CHECK.ID_CHECK_TYPE) " & _
        "ON R_CHECK_DIR.ID_CHECK_DIR = T_CHECK.ID_CHECK_DIR " & _
        "WHERE T_CHECK.ID_CHECK = " & sID_CHECK
     
    Set rs = New ADODB.Recordset
    Set cn = Application.CurrentProject.Connection
     
    rs.Open sFind_SQL, cn, adOpenStatic, adLockOptimistic
     
    If (rs.RecordCount <= 0) Then
        If rs.State = adStateOpen Then rs.Close
         
        Set rs = Nothing
        Set cn = Nothing
         
        DoCmd.Close
         
        Exit Sub
    Else
        Me!Edit_Number.Value = rs.Fields(0).Value   ' ID
        Me!Edit_Number.Enabled = False
         
        Me!Edit_AltNumber.Value = rs.Fields(1).Value
        Me!Edit_AltNumber.Enabled = False
         
        Me!ComboBox_CheckDir.Value = rs.Fields(2).Value
        Me!ComboBox_CheckDir.Enabled = False
        Me!btnCheckDir.Enabled = False
         
        Me!ComboBox_CheckType.Value = rs.Fields(3).Value
        Me!ComboBox_CheckType.Enabled = False
        Me!btnCheckType.Enabled = False
         
        Me!Edit_BegPer.Value = rs.Fields(4).Value
        Me!Edit_BegPer.Enabled = False
         
        Me!Edit_EndPer.Value = rs.Fields(5).Value
        Me!Edit_EndPer.Enabled = False
         
        Me!Edit_BegProv.Value = rs.Fields(6).Value
        Me!Edit_BegProv.Enabled = False
         
        Me!Edit_EndProv.Value = rs.Fields(7).Value
        Me!Edit_EndProv.Enabled = False
         
        Me!Edit_PrikazN.Value = rs.Fields(8).Value
        Me!Edit_PrikazN.Enabled = False
         
        Me!Edit_Prikaz_Date.Value = rs.Fields(9).Value
        Me!Edit_Prikaz_Date.Enabled = False
         
        Me!Edit_InfoDate.Value = rs.Fields(10).Value
         
        Me!Edit_Out_Date.Value = rs.Fields(11).Value
        Me!Edit_Out_Date.Enabled = False
         
        Me!ListBox_CheckUsers.RowSource = "SELECT A.ID_CHECK_USER, A.ID_CHECK, A.ID_USER, B.NAME1, B.NAME2, B.NAME3, B.JOB_TITLE " & _
            "FROM T_CHECK_USER A, T_USERS B " & _
            "WHERE A.ID_USER = B.ID_USER AND A.ID_CHECK = " & sID_CHECK
             
        Me!ListBox_TB.RowSource = "SELECT A.ID_TB_LINK, A.ID_CHECK, A.TB_INDEX, B.TB_NAME, B.TB_NAME & ( & A.TB_INDEX & )" & _
            "FROM T_TB_LINK A, R_TB B " & _
            "WHERE A.TB_INDEX = B.TB_INDEX AND A.ID_CHECK = " & sID_CHECK
         
        'SELECT [T_TB_LINK].[ID_TB_LINK], [T_TB_LINK].[ID_CHECK], [T_TB_LINK].[TB_INDEX] FROM [T_TB_LINK]
    End If
     
Err_Form_Open:
    If rs.State = adStateOpen Then rs.Close
    Set rs = Nothing
    Set cn = Nothing
End Sub
 
Пытаюсь сформировать строку для поиска в БД, сформированную строку пишу в sFind_SQL. По логике должно все работать, но на практике вылетает ошибка. Прошелся в отладчике, выяснил, что сформированная строка должна быть >255 символов, но реально она 255, в итоге получается ошибка.
 
Вопрос: как объявиться переменную типа String для хранения строк более 255 символов?

Всего записей: 29 | Зарегистр. 06-03-2005 | Отправлено: 22:50 08-03-2008
dneprcomp



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LuckyELF
Любая стринговая переменная может хранить > 255.
Из приведенного кода видно, что sFind_SQL объявлена как variant.  
Нет кода формирования строки sFind_SQL.
Зачем же приводить длинный и бесполезный код, не имеющий отношения к вопросу?
PS. В дальнейшем, если код действительно длинен, лучше его помещать между тегами  
[more=Читать дальше..] Здесь код [/more]

Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 03:25 09-03-2008 | Исправлено: dneprcomp, 03:34 09-03-2008
LuckyELF

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Все там есть, вот код формирования sFind_SQL:
 
sFind_SQL = "SELECT T_CHECK.ID_CHECK, T_CHECK.ALT_NUMBER, R_CHECK_DIR.CHECK_DIR_NAME, " & _  
        "R_CHECK_TYPE.CHECK_TYPE_NAME, T_CHECK.BEG_PROV_PERIOD, T_CHECK.END_PROV_PERIOD, " & _  
        "T_CHECK.BEG_PROV_DATE, T_CHECK.END_PROV_DATE, T_CHECK.PRIKAZ_N, T_CHECK.PRIKAZ_DATE, " & _  
        "T_CHECK.INFO_DATE, T_CHECK.OUT_DATE " & _  
        "FROM R_CHECK_DIR INNER JOIN " & _  
        "(R_CHECK_TYPE INNER JOIN T_CHECK ON R_CHECK_TYPE.ID_CHECK_TYPE = T_CHECK.ID_CHECK_TYPE) " & _  
        "ON R_CHECK_DIR.ID_CHECK_DIR = T_CHECK.ID_CHECK_DIR " & _  
        "WHERE T_CHECK.ID_CHECK = " & sID_CHECK
 
Я делал объявления
Dim sFind_SQL as String
и
Dim sFind_SQL  
 
разницы не увидел, в отладчике все равно строка не более 255 символов.
 
извините, спешил, поэтому код привел полностью.

Всего записей: 29 | Зарегистр. 06-03-2005 | Отправлено: 15:12 09-03-2008
dneprcomp



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LuckyELF
Ну, извини. Не заметил. Видимо, я тоже поторопился Но и форматировать код надо несколько тщательнЕе.
Объяви sFind_SQL как стринг. Попробуй посмотреть в отладчике содержимое такой команды: sFind_SQL = String(500, "A")
Если длина стринга = 500 символам, то никаких ограничений на твоей машине нет.
Тогда можно попробовать следующее для решения проблемы:
Не конкатенировать всю строку за один раз. Разбить ее на несколько кусков.

Код:
Dim strSelect as String
Dim strFrom as String
Dim strWhere as String
 
strSelect = "SELECT T_CHECK.ID_CHECK, T_CHECK.ALT_NUMBER," _
    & "R_CHECK_DIR.CHECK_DIR_NAME, " & "R_CHECK_TYPE.CHECK_TYPE_NAME," _
    & "T_CHECK.BEG_PROV_PERIOD, T_CHECK.END_PROV_PERIOD, "  _  
    & "T_CHECK.BEG_PROV_DATE, T_CHECK.END_PROV_DATE, T_CHECK.PRIKAZ_N," _
    & "T_CHECK.PRIKAZ_DATE, " & "T_CHECK.INFO_DATE, T_CHECK.OUT_DATE "
 
strFrom = "FROM R_CHECK_DIR INNER JOIN "  _  
     & "(R_CHECK_TYPE INNER JOIN T_CHECK ON R_CHECK_TYPE.ID_CHECK_TYPE = " _
     & "T_CHECK.ID_CHECK_TYPE) " & "ON R_CHECK_DIR.ID_CHECK_DIR = " _
     & "T_CHECK.ID_CHECK_DIR "
 
strWhere = "WHERE T_CHECK.ID_CHECK = " & sID_CHECK
 
sFind_SQL = strSelect & strFrom & strFrom

Проверь содержимое каждой переменной после присвоения. В том числе и sID_CHECK.
Возможно, именно конкатенация почему-то не работает нормально.
 
PS. А как, собственно, делаешь проверку на длину стринга?

Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 20:31 09-03-2008 | Исправлено: dneprcomp, 20:38 09-03-2008
LuckyELF

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
dneprcomp

Ты знаешь, я сначала попробовал по обычаю объявить ее как вариант - схватил ошибку, начал разбираться, выяснил что строка не вмещает весь скуэль скрипт, тогда я полез в справку, там вычитал, что есть 2 типа строк и что одна может хранить 64к а вторая 2^32, но как их объявить не сказано.
 
потом я попробовал sFind_SQL = String(64000, "A"), но в отладчике было по прежнему не более 255 символом.
 
выход я в итоге нашел, я написал запрос, сохранил его, и потом делал так:
 
select * from s_all_check where ...
 
но всеже решил выяснить, а можно ли хранить строчки более 255 символом, а то бывают ситуации, когда пишешь insert into ... и одно из полей, например адрес может быть символом 200, плюс остальной текст, в сумме будет за 300, которые благополучно обрезаются до 255, после чего сразу вылетает ошибка.
 
Длинну стринга я не проверяю, просто смотрю в отладчике, что строка сформировалась не полностью.

Всего записей: 29 | Зарегистр. 06-03-2005 | Отправлено: 10:52 10-03-2008
dneprcomp



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LuckyELF
Стринговая переменная не имеет таких ограничений. У меня(Access 2003) твой запрос формируется без ошибки, полностью. Ограничение на длину до 255 есть только у некоторых контролов. Пробовал ли по моему способу?
Хотелося бы посмотреть то, что ты нашел в справке. Можешь указать по какому слову искал? Или сохранить в pdf?
Цитата:
Длинну стринга я не проверяю, просто смотрю в отладчике
Вот в отладчике и проверь, используя ?Len(strSelect)
BTW, каким способом проверяешь в отладчике? Просто смотришь, поместив курсор на переменную или используешь Debug.Print ?. Возможно, отладчик просто не показывает полностью.

Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 19:49 10-03-2008
MrZeRo



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dneprcomp
По поводу строк хелп гласит (Справочник по языку Visual Basic - Data Types - String Data Type)

Цитата:
 
There are two kinds of strings: variable-length and fixed-length strings.  
A variable-length string can contain up to approximately 2 billion (2^31) characters.
A fixed-length string can contain 1 to approximately 64K (2^16) characters.  
 

но действительно ничего не говорится о том, как объявлять такие строки.
Вот что я нашел в других источниках:

Цитата:
 
Dynamic string variables contain character data of arbitrary length.  Internally, each string variable uses four bytes that contain a handle number, which is used to identify and locate information about a string.  Dynamic strings can contain up to approximately 2 Gb (2^31) characters.  The type-specifier character for a dynamic string is: $.
 

Я понял, что если объявляется строка  

Цитата:
DIM MyStr AS STRING * 10

то это статическая строка, а если  

Цитата:
DIM MyStr AS STRING

то динамическая.

----------
... не это главное ...

Всего записей: 831 | Зарегистр. 30-01-2002 | Отправлено: 16:56 11-03-2008
LuckyELF

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
У меня Access 2002 в состве OfficeXP. В редакторе я просто стал на слово String и нажал Ф1, вот что в итоге нашел:
 

Цитата:
 
String Data Type
       
 
There are two kinds of strings: variable-length and fixed-length strings.  
 
A variable-length string can contain up to approximately 2 billion (2^31) characters.
 
 
A fixed-length string can contain 1 to approximately 64K (2^16) characters.  
Note   A Public fixed-length string can't be used in a class module.  
 
The codes for String characters range from 0–255. The first 128 characters (0–127) of the character set correspond to the letters and symbols on a standard U.S. keyboard. These first 128 characters are the same as those defined by the ASCII character set. The second 128 characters (128–255) represent special characters, such as letters in international alphabets, accents, currency symbols, and fractions. The type-declaration character for String is the dollar sign ($).
 

 
По поводу длины, когда первый раз вылетела ошибка, я выбрал отладку, далее добавил строку переменную в отладку, потом скопировал ее содержимое в редактор фара, т.к. там мне полностью видно какой SQL код сформировался, там то собственно я и увидел, что строка немного коротковата.

Всего записей: 29 | Зарегистр. 06-03-2005 | Отправлено: 19:10 11-03-2008
dneprcomp



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MrZeRo
С объявленим строк правильно понял Но ведь ограничения-то на длину нет.  
 
LuckyELF
Разбивку по переменным сделал?  
В отладчике тоже прекрасно все видно. Не стоит привлекать сторонние програмы, что бы не было слишком много возможностей ошибки. В отладчике набираешь знак ?переменная и жмешь Enter
Цитата:
The codes for String characters range from 0–255. The first 128 characters (0–127) of the character set correspond to the letters and symbols on a standard U.S. keyboard
Это не об ограничении длины. Это об Asci кодах.

Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 20:03 11-03-2008
dementiy111



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Есть проблема. Кто знает как получить список всех таблиц в базе access и вывести его в поле со списком (выпадающий список) ?

Всего записей: 69 | Зарегистр. 27-02-2007 | Отправлено: 13:17 12-03-2008
Vitus_Bering



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dementiy111
httр://forum.sources.ru/index.php?showtopic=40991
httр://sql.ru/forum/actualthread.aspx?bid=4&tid=205889&hl=

Всего записей: 936 | Зарегистр. 30-09-2005 | Отправлено: 14:46 12-03-2008
AndVGri

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dementiy111

Код:
 
Public Sub DBTables()
    Dim db As DAO.Database
    Dim pTable As DAO.TableDef
    Set db = Application.CurrentDb
    For Each pTable In db.TableDefs
        Debug.Print pTable.Name
    Next pTable
End Sub
 

Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 04:26 13-03-2008
Palarm

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Подскажите, где можно найти лит-ру по Access для "чаиника"

книги и ресурсы по Access
http://accessoft.ru/forum/index.php?s=233cee5fcd239f511dad4a88a25dedd5&showtopic=72

Всего записей: 1 | Зарегистр. 13-03-2008 | Отправлено: 16:22 13-03-2008
LuckyELF

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
dneprcomp

 
Благодарю за помощь, действительно ограничения на длинну строки нет, как в приниципе и не было ошибки, точнее она была, но в другом месте, а вылазило все именно в этом месте :-(
 
В общем-то это уже в прошлом, зато появились новые проблемы.
 
На форме есть ComboBox (ComboBox_ErrorType), привязанные к таблице R_ERROR_TYPE (ID, ERROR_TYPE). При открытии формы, обрабатывает событие Form_Open, в нем проверяется наличие переданного парамета, выполняется некоторый запрос и результаты полученные при выполнении запроса нужно выставить в ComboBox, но что-то ничего не получается.
 
Сначала я попробовал написать так:

Код:
Me.ComboBox_ErrorType.Value = rs.Fields(3).Value

в принципе в комбобоксе появился текст, но когда впоследствии пытаешься изменить значение, то вылетает ошибка.
 
Кроме того, если ничего не менять, а просто нажать на кнопку, которая формирует и выполняет запрос на обновление, то также вылетает ошибка, т.к. ID не определен.
 
Тогда я попробовал сделать так:

Код:
For i = 0 To Me.ComboBox_ErrorType.ListCount
                If (rs.Fields(3).Value = Me.ComboBox_ErrorType.Column(1, i)) Then
                    Me.ComboBox_ErrorType.ListIndex = i  
                    Exit For
                End If
            Next i

 
После чего у меня стала вылетать ошибка:  
Run-time error '7777':
Неправильное использование свойства ListIndex.

 
Как правильно выставить комбобокс?

Всего записей: 29 | Зарегистр. 06-03-2005 | Отправлено: 18:19 17-03-2008
ab48



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Помогите кто может, нужно скопировать файл с текущей датой создания или самый новый файл в папке, я написала батник, но не могу взять у файла дату создания (именно дату создания, без времени), как это сделать, может кто знает?
 
@echo on
setlocal enabledelayedexpansion
set "folder=d:\1\"
set "copy_to=d:\2\"
for %%a in (%folder%*.000) do (
set "file_d=%%~ta"
if "!file_d!"=="%DATE%" copy %%a %copy_to%
)
 
В file_d заносится дата и время создания файла, как из нее выцепить только дату?
Заранее огромное спс.

Всего записей: 11 | Зарегистр. 13-03-2008 | Отправлено: 08:38 18-03-2008
dmka



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ab48
Одного не могу понять - причем тут Access?

Всего записей: 947 | Зарегистр. 23-04-2003 | Отправлено: 14:31 18-03-2008
Vitus_Bering



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ab48
http://forum.ru-board.com/topic.cgi?forum=62&bm=1&topic=11825&start=2020#lt

Всего записей: 936 | Зарегистр. 30-09-2005 | Отправлено: 17:57 18-03-2008
yellowair



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
привет всем, как я понял немного не тему, будет... но посещаемость хорошая. и ответ я думаю будет быстрым,
ситуация ms access 2003, есть 3 таблица (операции, накладная, номенклатура), так вот делаю запрос: типДок=1[покупка](т.Операции), товар(т.Номен...). кол-во.
у меня в таблице номенклатура 112 значений, а в запросе высвечивается только те по которым была покупка 91, как сделать так чтоб все 112 только кол-во у пустых =0
 
помогите...

Всего записей: 14 | Зарегистр. 10-02-2006 | Отправлено: 14:21 19-03-2008
yellowair



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
видимо помощи не дождаться мне никак.(((

Всего записей: 14 | Зарегистр. 10-02-2006 | Отправлено: 18:28 20-03-2008
AndVGri

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
yellowair
Приведи запрос по человечески в SQL, а так догадываться - экстрасенсов тут нет

Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 00:55 21-03-2008
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Access VBA


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru