powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / сепарация значений
25 сообщений из 29, страница 1 из 2
сепарация значений
    #39619223
Beliar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго дня! 8 лет не занимался Акцессом и программированием вообще, и не могу решить простую задачу.
В импортируемой таблице данные представлены вот так:
коднаименованиеколичество1Клиент1142Изделие183Изделие264Клиент2115Изделие136Изделие467Изделие528Клиент3159Изделие1810Изделие37
Т.е. в одном поле в виде записей перечислены покупатели и покупаемый ими товар. Хорошо, хоть есть поле (при чем ключевое) "код", однозначно задающее порядок записей, т.к. после записи "Клиент*" перечисляются позиции, покупаемые именно им. Короче, нужно представить в виде
клиентнаименование количествоКлиент1Изделие18Клиент1Изделие26Клиент2Изделие13Клиент2Изделие46Клиент2Изделие52Клиент3Изделие18Клиент4Изделие37
Допустим, поле "Клиент" уже есть в исходной таблице с пустыми значениями. Его буду заполнять оператором UPDATE, по прежде... Просто запросами не получится, создать формочку и в VB с помощью циклов нужно проанализировать поле "Наименование". Не могу вспомнить как циклы к выборке применять.
...
Рейтинг: 0 / 0
сепарация значений
    #39619225
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть некая запись
клиент наименование количество125 хрень125 1000
По каким признакам можно однозначно определить, клиент это или товар?
...
Рейтинг: 0 / 0
сепарация значений
    #39619228
Beliar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

a as string

Left( a ,6) = "Клиент"
Left( a ,6)="издели"
Хотя, можно и по первым 2-3 символам.

Вопрос, как в а перебирать значения поля "Наименование" из исходной таблицы.
...
Рейтинг: 0 / 0
сепарация значений
    #39619234
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то типа
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT t1.наименование AS клиент
     , t2.наименование AS наименование
     , t2.количество AS количество
FROM (SELECT * FROM table WHERE LEFT(наименование) = "К") AS t1
   , table AS t2
WHERE t1.код < t2.код
AND NOT EXISTS (SELECT * 
                FROM table 
                WHERE код > t1.код)
ORDER BY t1.код, t2.код
...
Рейтинг: 0 / 0
сепарация значений
    #39619236
Beliar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я вообще забыл, как с SQL-запросами в VBA работать. Есть запрос "SELECT bla-bla ... FROM bla-bla-bla", запускаем с помощью RunSQL, как перебрать циклом поле "Наименование" из этого запроса?
...
Рейтинг: 0 / 0
сепарация значений
    #39619238
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон, там должно быть LEFT(наименование,1) = "К"... ну в общем разберёшься, логика должна быть понятна.
...
Рейтинг: 0 / 0
сепарация значений
    #39619242
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BeliarЕсть запрос "SELECT bla-bla ... FROM bla-bla-bla", запускаем с помощью RunSQLАга... и результат уходит в никуда.

Beliarкак с SQL-запросами в VBA работать
Типа
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Dim db As Database
Dim rs As Recordset
Set db = CurrentDB
Set rs = db.OpenRecordset(strSQL)
With rs
    .MoveFirst
    Do Until .EOF
        Debug.Print .Fields("Наименование").Value
        .MoveNext
    Loop
    .Close
End With
Set rs=Nothing
Set db=Nothing
...
Рейтинг: 0 / 0
сепарация значений
    #39619250
Beliar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
в strSQL должен содержаться текст запроса?
...
Рейтинг: 0 / 0
сепарация значений
    #39619251
Beliar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
авторDebug.Print .Fields("Наименование").Value

Вот этим что делается?
...
Рейтинг: 0 / 0
сепарация значений
    #39619272
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Beliarв strSQL должен содержаться текст запроса?Да.
BeliarВот этим что делается?Выводится значение в окно отладки. Безопасный способ убедиться, что получено верное значение, используется при трассировке (Locals/Watch не всегда удобны...).
...
Рейтинг: 0 / 0
сепарация значений
    #39619293
Beliar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Dim q1 as string
q1= "SELECT Tab1.Код, Tab1.Наименование, Tab1.Количество, Tab1.Клиент FROM Tab1;"
Dim db As Database
Dim rs As Recordset
Set db = CurrentDB
Set rs = db.OpenRecordset(q1)
With rs
    .MoveFirst
    Do Until .EOF
       a=("Наименование").Value
       if left(a,1)="K" when b=""
       else b=a
       end if
        .MoveNext
    Loop
    .Close
End With
Set rs=Nothing
Set db=Nothing


Т.е. b принимает пустое значение, если это сам клиент, либо наименование клиента, если это изделие. Как бы теперь в каждом шаге Do Until присваивать полю Tab1.Клиент значение из b? И, кстати, перебор нужно делать в порядке, заданном в ключевом поле Tab1.Код, иначе рекорды все переебyтся, и будет неверная рассортировка товара по клиентам.
...
Рейтинг: 0 / 0
сепарация значений
    #39619311
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
a=("Наименование").Value


Вот что ты хотел сказать этой строкой кода?
Код: vbnet
1.
if left(a,1)="K" when b=""


А это что за бредовая конструкция?

И опять же текст запроса я тебе выше давал - а ты что в код засунул?
...
Рейтинг: 0 / 0
сепарация значений
    #39619350
Beliar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaИ опять же текст запроса я тебе выше давал - а ты что в код засунул?
Забыл саму таблицу Tab указать, а воткнул текст для указанного случая простой выборки, без условий, но в рабочем варианте запрос будет другой
коднаименованиеколичествоклиент1Клиент1142Изделие183Изделие264Клиент2115Изделие136Изделие467Изделие528Клиент3159Изделие1810Изделие37

Akina
Код: vbnet
1.
a=("Наименование").Value


Вот что ты хотел сказать этой строкой кода?

Мож, я неверно понял. ("Наименование").Value - значение поля "наименование"?

Akina
Код: vbnet
1.
if left(a,1)="K" when b=""


А это что за бредовая конструкция?

Я неправильно сконструировал. Вот так
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Do Until .EOF
        a=("Наименование").Value
       if left(a,1)="K" 
            when b=а
            ("Клиент").Value=""
       end if
       ("Клиент").Value=b  'не уверен в правильности синтаксиса или метода
        .MoveNext
Loop


Т.е. на каждом шаге цикла значение поля "наименование" помещаем в а , проверяем, если это "Клиент*", то в b берем это значение, а в поле "Клиент" - пустое "", если нет (т.е. это "изделие*"), то b остается прежним (т.е. то, что присвоили при предыдущем обнаружении значения "Клиент*", это я и делал с помощью условия left(a,1)="K"), и это же значение вставляем в поле "клиент". Должно получиться так:
коднаименованиеколичествоклиент1Клиент1142Изделие18Клиент13Изделие26Клиент14Клиент2115Изделие13Клиент26Изделие46Клиент27Изделие52Клиент28Клиент3159Изделие18Клиент310Изделие37Клиент3
...
Рейтинг: 0 / 0
сепарация значений
    #39619355
Beliar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Do Until .EOF
        a=("Наименование").Value
       if left(a,1)="K" 
            when b=а
            ("Клиент").Value=""
       else ("Клиент").Value=b 
         end if
       .MoveNext
Loop
...
Рейтинг: 0 / 0
сепарация значений
    #39619366
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaТипа
Код: vbnet
1.
2.
3.
'...
        Debug.Print .Fields("Наименование").Value
'...
...
Рейтинг: 0 / 0
сепарация значений
    #39619367
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ещё - посмотри встроенную справку по IF Statement. И сравни со своим опусом ПО БУКВАМ.
...
Рейтинг: 0 / 0
сепарация значений
    #39619378
Beliar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaА ещё - посмотри встроенную справку по IF Statement. И сравни со своим опусом ПО БУКВАМ.
да сам увидел, then конечно же, а не when, это по запарке)))))
AkinaAkinaТипа
Код: vbnet
1.
2.
3.
'...
        Debug.Print .Fields("Наименование").Value
'...


Как раз то, чего я, видимо не знаю.
Код: vbnet
1.
а = .Fields("Наименование").Value

,т.е. а принимает значение из поля "наименование", или снова не то.
И, наоборот, как вставить значение в поле?
Код: vbnet
1.
.Fields("Наименование").Value = ""

?
...
Рейтинг: 0 / 0
сепарация значений
    #39619380
Beliar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чувствую себя бараном, не могу сейчас ни старые работы свои посмотреть, ни в литературу залесть
...
Рейтинг: 0 / 0
сепарация значений
    #39619409
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BeliarКак раз то, чего я, видимо не знаю.
Код: vbnet
1.
а = .Fields("Наименование").Value


,т.е. а принимает значение из поля "наименование", или снова не то.
И, наоборот, как вставить значение в поле?
Код: vbnet
1.
.Fields("Наименование").Value = ""


?
Почти. Только ещё нужно учесть, что ты находишься внутри With-блока, и с его учётом .Fields("Наименование").Value на самом деле есть rs.Fields("Наименование").Value. Конечно, всё это поддаётся упрощению - например, свойство Value есть свойство по умолчанию, так что rs.Fields("Наименование").Value эквивалентно rs.Fields("Наименование"). Ну и - поле рекордсета есть элемент коллекции его дефолтного свойства, так что rs.Fields("Наименование") эквивалентно rs!Наименование. Но мне, например, не нравятся подобные "упрощения" и кивание на дефолтность свойств.

И да - в указанной версии открытия рекордсета он имеет тип Dynaset, так что имеет тип доступа Read/Write, и присвоение возможно. Если предварительно открыть запись на корректировку методом rs.Edit, и не забыть записать внесённые изменения методом rs.Update.
...
Рейтинг: 0 / 0
сепарация значений
    #39619427
Beliar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

кажется, понял:
Код: vbnet
1.
2.
3.
rs.Edit
rs.Fields("Наименование").Value = "присваиваемое значение"
rs.Update
...
Рейтинг: 0 / 0
сепарация значений
    #39619441
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Угу... ну с учётом типа данных поля и, соответственно, свойства Value этого поля. Если оно, скажем. числовое - нежелательно присваивать ему строку, надеясь на неявное приведение типов.
...
Рейтинг: 0 / 0
сепарация значений
    #39619535
Beliar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Ну, спасибо огромное, завтра попробую
...
Рейтинг: 0 / 0
сепарация значений
    #39619611
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
теоретически-ДА,а реально,в "боевой" базе, Вы эту задачу не решите:как быть если клиент Трещоткин а изделие трещотка?(как говорил Козьма Прутков,за точность цитаты не ручаюсь,но как-то так: "На любую большую трубу обязательно найдется еще больший предмет который заткнет её) Реально только одно-настучать по голове тем кто представляет такие данные и добиться чтоб они были в адекватном виде
...
Рейтинг: 0 / 0
сепарация значений
    #39620307
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если в Debug.Print полностью задать имя контрола? Не пробовали?
...
Рейтинг: 0 / 0
сепарация значений
    #39620344
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
учитывая что есть сортировка, необязательно привязываться к наименованию- пройти по числам исходя из того что число в 1-й строке- это сумма последующих, как добрали до первого числа количество - (или если больше- то это следующий клиент) - перешли к следующему клиенту и т.д.
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / сепарация значений
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]