powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Селектор типов данных
28 сообщений из 28, показаны все 2 страниц
Селектор типов данных
    #36583473
P_bogdan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VB6.
Нужно пропарсить масив строк. Строки состоят из набора данных, разделенных "табом". Потом добавить все эти данные в базу (mdb). Позиции данных и поля в таблице соответствуют (по номеру). В таблице форматы полей соответствуют.
Данные считываю в массив и, через рекордсет (DAO) заношу в таблицу БД.
Но проблема вот в чем : даты и числа могут иметь разные форматы. Например :
дата 01.02.2010,
01.02.10;

число 56.55,
56,55,
-56,55
-56.55.
Так вот, надо проверить все элементы масива и, если данный элемент не соответствует типу в таблице, преобразовать его в этот тип.
Вот пример:
Код Название Дата Цена Наценка
---------------------------------------------------------------------------------------
12833 Актиферрин сироп фл. 100 мл 27.01.2010 28,98 8,94
12608 Бисептол сусп. фл. 80 мл 05.03.10 19.00 -3,22
---------------------------------------------------------------------------------------

Повлиять на однородность соответствующих данных в файле не возможно.
Количество записей не очень большое.

Прошу помочь написать функцию проверки.
Спасибо.
...
Рейтинг: 0 / 0
Селектор типов данных
    #36583483
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для чисел необходимо перед преобразованием провести замену точки и запятой на текущий разделитель. Дата распознается в обоих форматах.

Что конкретно вызывает затруднения?
...
Рейтинг: 0 / 0
Селектор типов данных
    #36583498
P_bogdan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

С точкой - это понятно, надо привести. Но обрабатываю данные в цикле и для замены запятой на точку, мне надо знать,что я обрабатываю сумму, а не, допустим, "название"(пример).

С датой тоже проблем не будет.
Суть проблемы - определить: строка,дата или число. Дальше я умею.
...
Рейтинг: 0 / 0
Селектор типов данных
    #36583503
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
суть вопроса:
как определить тип поля DAO-рекордсета?

так?
...
Рейтинг: 0 / 0
Селектор типов данных
    #36583509
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
RecSet.Fields(i).Type

константы найдете в хелпе
...
Рейтинг: 0 / 0
Селектор типов данных
    #36583514
P_bogdan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Не совсем.
Вот пример кода:

Dim Lines As Variant, v As Variant, i As Long, j As Long

Open strPath For Input As #filenum: Lines = Input(LOF(1), 1): Close #filenum
Lines = Split(Lines, vbCrLf)

Set rstInvDet = dbs.OpenRecordset("InvoiceDet")
For j = 3 To UBound(Lines)
If Len(Lines(j)) > 0 Then
v = Split(Lines(j), vbTab) 'Преобразуем строку в массив элементов
rstInvDet.AddNew
For i = 0 To UBound(v)
If Len(v(i)) > 0 Then rstInvDet.Fields(i) = v(i)
Next
rstInvDet.Update
End If
Next j

При таком методе я должен знать тип данныч v(i) , чтобы вставить в поле таблицы. Тип я смогу преобразовать. но при замене запятой на точку мне надо знать , что это не "название" а "сумма".
...
Рейтинг: 0 / 0
Селектор типов данных
    #36583515
P_bogdan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Надо определить не тип поля рекордсета, а тип данных, для коректной обработки.
...
Рейтинг: 0 / 0
Селектор типов данных
    #36583522
P_bogdan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Например:

rstInvDet.AddNew
For i = 0 To UBound(v)
If Len(v(i)) > 0 Then
If (v(i)) Число Then
rstInvDet.Fields(i) = Преобразовать в Double(v(i))
Else
rstInvDet.Fields(i) = v(i)
End If

Next
...
Рейтинг: 0 / 0
Селектор типов данных
    #36583525
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P_bogdanНадо определить не тип поля рекордсета, а тип данных, для коректной обработки.

вы себе противоречите:

P_bogdanПозиции данных и поля в таблице соответствуют (по номеру). . В таблице форматы полей соответствуют.

то есть если есть соответствие - кто мешает смотреть по рекордсету.

Но если вам хочется так - см. функции IsDate и IsNumeric

P.S. используйте тэги для оформления кода
...
Рейтинг: 0 / 0
Селектор типов данных
    #36583534
P_bogdan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Я наверно не очень внятно все объяснил. Прошу прощения. Попробую еще раз.

Мне нужна функция, что то типа такой:

автор
funType(v(i))' Функция, которая определяет тип данных.

Select Case funType
Case "Строка"
Что-то делаем со строкой
Case "Число"
Что-то делаем с числом
Case "Дата"
Что то делаем с датой
End Select


?isnumeric("-20.022010")
False
?isnumeric("-20,022010")
True

А я не знаю какой будет разделитель.
...
Рейтинг: 0 / 0
Селектор типов данных
    #36583540
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P_bogdanА я не знаю какой будет разделитель.

так вы сделайте замену разделителя ДО проверки функцией IsNumeric

P.S. Используйте правильные тэги (SRC) для кода
...
Рейтинг: 0 / 0
Селектор типов данных
    #36583545
P_bogdan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Да, но если я сделаю замену до проверки, то поменяются запятые и в строке(если они там будут).

P.S. Спасибо.
...
Рейтинг: 0 / 0
Селектор типов данных
    #36583567
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P_bogdanДа, но если я сделаю замену до проверки, то поменяются запятые и в строке(если они там будут).

И что?
...
Рейтинг: 0 / 0
Селектор типов данных
    #36583573
P_bogdan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Ну , некрасиво будет: вместо Анальгин, табл. -> Анальгин.табл.
...
Рейтинг: 0 / 0
Селектор типов данных
    #36583581
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P_bogdanНу , некрасиво будет: вместо Анальгин, табл. -> Анальгин.табл.

????
Консультации консультациями, но свой-то мозг не отключайте!
Я не предлагал вам делать замены в конечных данных.
...
Рейтинг: 0 / 0
Селектор типов данных
    #36583584
P_bogdan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Спасибо за консультации. Кое-что почерпнул полезное (после более внимательного чтения Ваших сообщений). Попробую использовать. Еще раз спасибо.
...
Рейтинг: 0 / 0
Селектор типов данных
    #36583585
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P_bogdan Цена Наценка P_bogdanIf (v(i)) Число Then
rstInvDet.Fields(i) = Преобразовать в Double (v(i))
Дружеский совет - не используйте неточные типы данных для денег. Для этого есть точные типы данных, например "денежный".
...
Рейтинг: 0 / 0
Селектор типов данных
    #36583589
P_bogdan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Спасибо. Я знаю. Сейчас вношу изменения в БД и код для использования Currency.
...
Рейтинг: 0 / 0
Селектор типов данных
    #36583692
P_bogdan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Что-то получилось . Сейчас тестирую.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  If dhIsCharNumeric1(v(i)) Then
          rstInvDet.Fields(i) = CDbl(v(i))
  Else
         rstInvDet.Fields(i) = v(i)
 End If


Function dhIsCharNumeric1(strText As Variant) As Boolean
'
    dhIsCharNumeric1 = (strText Like "[-,0-9]*") _
        And Not IsDate(strText) And VarType(strText) <>  8 
End Function

Использовал функцию от Гетца,Джилберта.

Пока работа с несколькими файлами данных нормальная, без ошибок.
Дальше буду проверять.
...
Рейтинг: 0 / 0
Селектор типов данных
    #36583739
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Он, может, и уважаемый человек, но меня такой результат не устроил бы

Код: plaintext
1.
?"544-34.,45,5" Like "[-,0-9]*"
True
...
Рейтинг: 0 / 0
Селектор типов данных
    #36583754
P_bogdan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Да, ошибочка :-(. Я уже заметил. Тут проверка по первому знаку. Надо попробовать проверить всю переменную.
...
Рейтинг: 0 / 0
Селектор типов данных
    #36583768
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P_bogdanДа, ошибочка :-(. Я уже заметил. Тут проверка по первому знаку. Надо попробовать проверить всю переменную.

Ага. Проверить нецифровые знаки. Пересчитать точки с запятыми. Проверить правильность позиции минуса. Чем не устраивает IsNumeric?
...
Рейтинг: 0 / 0
Селектор типов данных
    #36583784
P_bogdan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

?isnumeric("45,5")
True

?isnumeric("45.5")
False
...
Рейтинг: 0 / 0
Селектор типов данных
    #36583789
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P_bogdanС точкой - это понятно, надо привести. Но обрабатываю данные в цикле и для замены запятой на точку, мне надо знать,что я обрабатываю сумму, а не, допустим, "название"(пример).

С датой тоже проблем не будет.
Суть проблемы - определить: строка,дата или число. Дальше я умею.

А какая вообще проблема? Как я понимаю все поля строки разделены таб-ами. Так что вы вначале разбиваете строку на поля, а потом уже в конкретном поле и делаете подстановку...
...
Рейтинг: 0 / 0
Селектор типов данных
    #36583790
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Селектор типов данных
    #36583793
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
?isnumeric(replace(replace("45,5",".",DecimalSeparator),",",DecimalSeparator))
True
?isnumeric(replace(replace("45.5",".",DecimalSeparator),",",DecimalSeparator))
True

В качестве DecimalSeparator используйте вашу любимую функцию определения текущего разделителя. Лично я не знаю, как правильно, поэтому вот:
Код: plaintext
1.
2.
3.
4.
Public Function DecimalSeparator() As String

DecimalSeparator = Mid$(Format$( 1 . 1 ),  2 ,  1 )

End Function
...
Рейтинг: 0 / 0
Селектор типов данных
    #36583795
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrFТак что вы вначале разбиваете строку на поля, а потом уже в конкретном поле и делаете подстановку...

AndrF, при всем уважении, ты б дочитал сначала топик до конца, прежде, чем отвечать на первое сообщение.
...
Рейтинг: 0 / 0
Селектор типов данных
    #36583804
P_bogdan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Очень хорошо. Кажется, то что надо. Спасибо.
...
Рейтинг: 0 / 0
28 сообщений из 28, показаны все 2 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Селектор типов данных
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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