Колонны домкраты вышли из строя?
У меня есть приложение, которое загружает финансовые данные из таблицы YQL yahoo.finance.quotes в формате xml, а затем записывает эти данные в базу данных MS Access. Я использую Jackcess для взаимодействия с базой данных, но у меня возникла странная проблема с добавлением строк.
Когда я вызываю .addRow(), все поля записываются в файл правильно, кроме нескольких, которые переключаются. Вот пример XML-файла, который я хотел бы загрузить и использовать (с JAXB)...
<query xmlns:yahoo="http://www.yahooapis.com/v1/base.rng" yahoo:count="1" yahoo:created="2013-08-01T18:03:53Z" yahoo:lang="en-US">
<results>
<quote>
<BookValue>236.698</BookValue>
<EarningsShare>34.565</EarningsShare>
<EPSEstimateCurrentYear>43.54</EPSEstimateCurrentYear>
<EPSEstimateNextYear>51.34</EPSEstimateNextYear>
<EPSEstimateNextQuarter>11.82</EPSEstimateNextQuarter>
<DaysLow>895.00</DaysLow>
<DaysHigh>903.07</DaysHigh>
<YearLow>623.41</YearLow>
<YearHigh>928.00</YearHigh>
<LastTradePriceOnly>901.83</LastTradePriceOnly>
<FiftydayMovingAverage>893.586</FiftydayMovingAverage>
<TwoHundreddayMovingAverage>856.999</TwoHundreddayMovingAverage>
<Open>895.67</Open>
<PreviousClose>887.75</PreviousClose>
<PriceSales>5.30</PriceSales>
<PriceBook>3.75</PriceBook>
<PERatio>25.68</PERatio>
<PEGRatio>1.41</PEGRatio>
<PriceEPSEstimateCurrentYear>20.39</PriceEPSEstimateCurrentYear>
<PriceEPSEstimateNextYear>17.29</PriceEPSEstimateNextYear>
<ShortRatio>1.90</ShortRatio>
<OneyrTargetPrice>985.32</OneyrTargetPrice>
<Volume>1460983</Volume>
<Ask>901.90</Ask>
<AverageDailyVolume>2330360</AverageDailyVolume>
<Bid>901.54</Bid>
</quote>
</results>
</query>
<!-- total: 222 -->
<!-- engine4.yql.ne1.yahoo.com -->
А вот XML-экспорт полученной базы данных доступа...
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2013-08-01T13:28:55">
<GOOG>
<ID>1375380249345</ID>
<BOOK_VALUE>901.9</BOOK_VALUE>
<EARNINGS_SHARE>3.75</EARNINGS_SHARE>
<EPS_ESTIMATE_CURRENT_YEAR>34.565</EPS_ESTIMATE_CURRENT_YEAR>
<ESP_ESTIMATE_NEXT_YEAR>43.54</ESP_ESTIMATE_NEXT_YEAR>
<EPS_ESTIMATE_NEXT_QUARTER>51.34</EPS_ESTIMATE_NEXT_QUARTER>
<DAYS_LOW>11.82</DAYS_LOW>
<DAYS_HIGH>895</DAYS_HIGH>
<YEAR_LOW>903.07</YEAR_LOW>
<YEAR_HIGH>623.41</YEAR_HIGH>
<LAST_TRADE_PRICE_ONLY>1.9</LAST_TRADE_PRICE_ONLY> <!-- Offending column -->
<FIFTYDAY_MOVING_AVERAGE>928</FIFTYDAY_MOVING_AVERAGE>
<TWO_HUNDREDDAY_MOVING_AVERAGE>901.83</TWO_HUNDREDDAY_MOVING_AVERAGE>
<OPEN>893.586</OPEN>
<PRICE_SALES>856.999</PRICE_SALES>
<PRICE_BOOK>895.67</PRICE_BOOK>
<PE_RATIO>5.3</PE_RATIO>
<PEG_RATIO>3.75</PEG_RATIO>
<PRICE_EPSESTIMATE_CURRENT_YEAR>25.68</PRICE_EPSESTIMATE_CURRENT_YEAR>
<PRICE_EPS_ESTIMATE_NEXT_YEAR>1.41</PRICE_EPS_ESTIMATE_NEXT_YEAR>
<ONEYR_TARGET_PRICE>985.32</ONEYR_TARGET_PRICE>
<SHORT_RATIO>1460983</SHORT_RATIO> <!-- Offending column -->
<VOLUME>2330360</VOLUME> <!-- Offending column -->
<ASK>20.39</ASK>
<AVERAGE_DAILY_VOLUME>901</AVERAGE_DAILY_VOLUME> <!-- Offending column -->
<BID>17.29</BID>
</GOOG>
</dataroot>
Вот мой код, чтобы добавить значения из XML в базу данных, если это поможет...
public synchronized void storeData(Query query) throws InterruptedException, IOException {
long idL = System.currentTimeMillis();
BigDecimal id = new BigDecimal(idL);
double bookValue = query.results.quote.getPriceBook();
double earningsShare = query.results.quote.getEarningsShare();
double epsEstimateCurrentYear = query.results.quote.getEPSEstimateCurrentYear();
double epsEstimateNextYear = query.results.quote.getEPSEstimateNextYear();
double epsEstimateNextQuarter = query.results.quote.getEPSEstimateNextQuarter();
double daysLow = query.results.quote.getDaysLow();
double daysHigh = query.results.quote.getDaysHigh();
double yearLow = query.results.quote.getYearLow();
double yearHigh = query.results.quote.getYearHigh();
double lastTradePriceOnly = query.results.quote.getLastTradePriceOnly();
double fiftydayMovingAverage = query.results.quote.getFiftydayMovingAverage();
double twoHundreddayMovingAverage = query.results.quote.getTwoHundreddayMovingAverage();
double open = query.results.quote.getOpen();
double priceSales = query.results.quote.getPriceSales();
double priceBook = query.results.quote.getPriceBook();
double peRatio = query.results.quote.getPERatio();
double pegRatio = query.results.quote.getPEGRatio();
double priceEPSEstimateCurrentYear = query.results.quote.getPriceEPSEstimateCurrentYear();
double priceEPSEstimateNextYear = query.results.quote.getPriceEPSEstimateNextYear();
double shortRatio = query.results.quote.getShortRatio();
double oneyrTargetPrice = query.results.quote.getOneyrTargetPrice();
int volume = query.results.quote.getVolume();
double ask = query.results.quote.getAsk();
int averageDailyVolume = query.results.quote.getAverageDailyVolume();
double bid = query.results.quote.getBid();
dBTable.addRow(id, bookValue, earningsShare, epsEstimateCurrentYear, epsEstimateNextYear, epsEstimateNextQuarter, daysLow, daysHigh,
yearLow, yearHigh, close, fiftydayMovingAverage, twoHundreddayMovingAverage, open, priceSales, priceBook,
peRatio, pegRatio, priceEPSEstimateCurrentYear, priceEPSEstimateNextYear, shortRatio, oneyrTargetPrice, volume, ask, averageDailyVolume, bid);
}
Как вы можете видеть, только цена последней сделки, короткое соотношение, объем и среднесуточный объем смешаны.
Может ли кто-нибудь сказать мне, почему это и как это исправить? Спасибо.
1 ответ
По крайней мере, часть вашей проблемы заключается в том, что addRow()
Метод в Jackcess требует, чтобы значения были предоставлены " в порядке столбцов таблицы " (выделите их, см. раздел "Добавление строки"). Ваш addRow()
звонок указывает
... shortRatio, oneyrTargetPrice, volume ...
но дамп XML таблицы Access предполагает, что порядок столбцов
<ONEYR_TARGET_PRICE>985.32</ONEYR_TARGET_PRICE>
<SHORT_RATIO>1460983</SHORT_RATIO> <!-- Offending column -->
<VOLUME>2330360</VOLUME> <!-- Offending column -->
Вы также можете дважды проверить типы переменных по отношению к типам столбцов, чтобы убедиться, что они также совпадают.